aws-samples/sample-codex-amazon-bedrock-usage-governance-with-litellm

GitHub: aws-samples/sample-codex-amazon-bedrock-usage-governance-with-litellm

该平台通过 LiteLLM 代理和 Amazon Bedrock 为企业团队提供 Codex AI 的集中预算控制、访问治理和使用审计能力。

Stars: 1 | Forks: 0

# 通过 Amazon Bedrock 使用 OpenAI Codex — 使用 LiteLLM 和 Streamlit UI 进行使用治理 一个为工程团队集中治理、管理和监控 Codex AI 访问权限的平台,使用 **Amazon Bedrock** 作为推理后端,**LiteLLM** 作为代理层。 ## 问题背景 当企业向整个团队推出 OpenAI Codex(或任何基于 LLM 的开发者工具)时,会立即出现三个棘手的问题: 1. **缺乏支出控制。** 每位开发者的使用量都直接指向 Bedrock。既没有单用户预算,也没有团队上限,在收到月度账单之前根本无法阻止支出的失控。 2. **缺乏可见性。** 没有关于谁调用了哪个模型、使用了多少 token 以及花费了多少的审计记录。财务和安全团队无法回答“谁使用了什么?”的问题。 3. **缺乏访问权限治理。** 新开发者入职需要手动配置 API 密钥和模型权限,且无法与公司现有的身份管理系统(AWS IAM Identity Center / SSO)关联。离职处理同样依赖手动操作且极易出错。 ## 解决方案 该平台部署在您的开发者和 Bedrock 之间,在不改变开发者使用 OpenAI Codex 方式的前提下,增加了一个治理和可观测性层。 ``` Developers /OpenAI Codex / Chat App │ ▼ LiteLLM Proxy (:4000) ← API key auth, budget enforcement, rate limits │ ▼ Amazon Bedrock (us-east-2) ← GPT 5.5 / GPT 5.4 │ ▼ CloudWatch Logs ← Per-user audit trail for every API call PostgreSQL (RDS) ← Spend tracking, user/team state ``` 管理仪表板(Streamlit,端口 8501)为运维/平台团队提供了一个覆盖整个生命周期的 GUI。一个自助服务聊天应用(Streamlit,端口 8502)则为终端用户提供了一个受治理的 Codex Chat 界面。 ## 架构 ![架构](https://static.pigsec.cn/wp-content/uploads/repos/cas/e9/e9c421bd3efdf3e19d7702c9138f90b6eeb27565002de027002208b4060352de.jpg) ## 核心功能 ### 用户与群组管理 - 创建、查看和删除具有自动生成 API 密钥的用户 - 与 **AWS IAM Identity Center** 双向同步 —— 导入用户和群组,或将更改推送回去 - 将用户分配到团队;团队成员资格决定了其对模型的访问权限和共享预算池 ### 预算与速率限制强制执行 - 设置单用户和单团队的 USD 预算(按月或滚动计算) - 设置每分钟 token (TPM) 和每分钟请求数 (RPM) 限制 - LiteLLM 会在用户达到限制的瞬间硬阻断 API 调用 —— 杜绝任何超额支出 - **仅限手动重置:** 管理员需显式重置支出计数器;用户无法自行重置 - 每次重置都会被记录到不可篡改的支出审计历史记录表中 ### 模型访问控制 - 为单个用户或团队设置特定 Bedrock 模型的白名单 - 可直接从“模型管理”页面添加新的 Bedrock 推理配置文件,无需重启容器 - 默认配置定义在 `litellm_config.yaml` 中,确保新用户自动获得安全的起始配置 ### 可观测性 - 实时使用情况仪表板:按用户/团队统计的支出、token 明细、延迟情况 - 为每个成功和失败事件提供单用户的 CloudWatch 日志流 (`/litellm/Codex-code-usage/user-{user_id}`) - 支出审计历史记录页面显示所有管理员重置操作的完整记录(谁执行了重置、时间、先前支出、备注) ### Codex Chat 应用(终端用户界面) - 通过用户 API 密钥进行身份验证的自托管聊天 UI —— 用户只能看到自己的预算和允许使用的模型 - 通过 DuckDuckGo(工具调用)进行网络搜索,实现实时信息落地 - 提供预算进度条和速率限制指示器,让用户一目了然地了解自己的使用状态 | 组件 | 技术 | 端口 | |---|---|---| | LiteLLM 代理 | Docker (`ghcr.io/berriai/litellm:v1.89.3`) | 4000 | | 管理仪表板 | Streamlit + Python | 8501 | | Codex Chat 应用 | Streamlit + Python | 8502 | | 数据库 | AWS RDS 上的 PostgreSQL | 5432 | | 审计日志 | AWS CloudWatch Logs | — | | 身份同步 | AWS IAM Identity Center | — | 这三个服务全部通过 `docker-compose.yml` 组合连接。Bedrock 凭证直接从 EC2 实例配置文件获取 —— 无需长期有效的 AWS 密钥。 ## 入门指南 ### 前置条件 - 在 `us-east-2`(或您的目标区域)拥有 Bedrock 访问权限的 AWS 账户 - PostgreSQL RDS 实例(或任何兼容 Postgres 的数据库) - 具备 Bedrock 和 IAM Identity Center 权限的 IAM 角色的 EC2 实例(或 ECS 任务) - 已安装 Docker 和 Docker Compose ### 配置说明 **1. 更新 `litellm_config.yaml`**,填入您的 Bedrock 推理配置文件 ARN 和 RDS 连接字符串。 **2. 更新 `docker-compose.yml`** 环境变量: ``` DATABASE_URL=postgresql://:@:5432/litellm LITELLM_MASTER_KEY= IDENTITY_STORE_ID= AWS_REGION_NAME= ``` **3. 设置管理员凭证**,位置位于: - `litellm-admin-dashboard/.streamlit/secrets.toml` - `Codex-chat-app/.streamlit/secrets.toml` ### 启动 ``` docker compose up -d ``` - 管理仪表板: `http://:8501` - Codex Chat 应用: `http://:8502` - LiteLLM API: `http://:4000` ### 开发者设置 (Codex Code) 在 ~codex/config.toml 中将 Codex 指向 LiteLLM 代理,并使用从管理仪表板中为该用户生成的 API 密钥: ``` model = "gpt-5.5" model_provider = "litellm" [model_providers.litellm] name = "LiteLLM Proxy" base_url = "http:///v1" wire_api = "responses" [model_providers.litellm.http_headers] Authorization = "Bearer sk-" ``` ## 项目结构 ``` Codex-code-admin/ ├── docker-compose.yml # All three services ├── litellm_config.yaml # Model list, budget defaults, LiteLLM settings ├── custom_callback.py # CloudWatch audit logger (per-user log streams) ├── litellm-admin-dashboard/ │ ├── app.py # Dashboard home + quick stats │ ├── auth.py # Password-gated admin auth │ ├── pages/ │ │ ├── 1_User_Management.py # Add/delete users, sync from Identity Center │ │ ├── 2_Group_Management.py # Team creation, user assignment │ │ ├── 3_Budget_Controls.py # Per-user / per-team limits, bulk reset │ │ ├── 4_Usage_Dashboard.py # Real-time spend analytics │ │ ├── 5_Model_Management.py # View and add Bedrock models │ │ └── 6_Spend_Audit_History.py # Immutable spend reset audit trail │ └── utils/ │ ├── litellm_client.py # LiteLLM REST API wrapper │ ├── identity_center.py # AWS IAM Identity Center client │ ├── spend_tracker.py # Spend reset audit log (Postgres) │ └── config_loader.py # litellm_config.yaml reader └── Codex-chat-app/ ├── app.py # Chat UI with web search and file upload ├── auth.py # API-key-based user auth └── utils/ ├── file_handler.py # Multi-format file-to-API conversion └── chat_config_loader.py # Model list and budget fetcher ``` ## 为什么采用此方案 - **代理层无供应商锁定。** LiteLLM 支持 OpenAI 的 API 格式,因此任何支持 OpenAI 的工具(Cursor、VS Code 扩展、CI 流水线)均可直接使用,无需修改。 - **Bedrock 将数据保留在您的 AWS 账户中。** 任何 prompt 数据都不会离开您的 AWS 环境。 - **EC2 实例配置文件身份验证。** 配置文件或环境变量中不存储任何 AWS 访问密钥。 - **硬预算阻断,而非软警告。** 代理会在达到限制时直接拒绝请求 —— 不采用“通知并祈祷”的模式。 - **可在容器重启后保留的审计记录。** CloudWatch 日志流和 Postgres 记录独立于容器的生命周期之外。 ## 安全 有关更多信息,请参阅 [贡献指南](CONTRIBUTING.md#security-issue-notifications)。 ## 许可证 本库基于 MIT-0 许可证授权。详情请参阅 LICENSE 文件。
标签:AI治理, Amazon Bedrock, DLL 劫持, Kubernetes, LiteLLM, LLM网关, Streamlit, 大语言模型, 成本管理, 测试用例, 访问控制, 请求拦截, 运维监控, 逆向工具