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 界面。
## 架构

## 核心功能
### 用户与群组管理
- 创建、查看和删除具有自动生成 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, 大语言模型, 成本管理, 测试用例, 访问控制, 请求拦截, 运维监控, 逆向工具