在 Amazon ECS 上用 LiteLLM 为 Codex 接入 Amazon Bedrock

2026-09-04 29 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

当团队希望让 Codex 使用 Amazon Bedrock 中托管的 OpenAI 模型时,直接给每位开发者分发 AWS 凭证并不是唯一方案。一个更便于集中治理的做法,是在 Amazon ECS 与 AWS Fargate 上运行自管 LiteLLM 网关,由它暴露兼容 OpenAI Responses API 的入口,并统一处理身份、预算、限流和遥测。

这套架构的关键不只是“转发请求”。LiteLLM 位于 Codex 和 Bedrock 之间,成为模型别名、虚拟密钥和消费策略的执行点;ECS 则负责容器运行、扩缩容和故障恢复。

请求是怎样流动的

典型调用链如下:

Codex CLI
  -> HTTPS /v1/responses
  -> LiteLLM on ECS/Fargate
  -> AWS SDK credential chain / ECS task role
  -> Amazon Bedrock
  -> OpenAI model

这里需要分清两种身份:

  • Codex 使用 LiteLLM 虚拟密钥访问网关。密钥可以绑定用户、团队、模型、预算以及 RPM/TPM 限额。
  • LiteLLM 容器通过 ECS task role 调用 Bedrock。AWS 长期访问密钥不应写进镜像、任务定义或 Codex 配置。

因此,开发者不需要直接获得 Bedrock 权限,而平台团队仍然可以按人或按项目追踪成本。生产环境还应将网关置于负载均衡器之后,启用 TLS,并限制安全组入口;如果它只供公司网络使用,可以通过私有子网、内部 ALB、VPN 或其他私有连接暴露。

先在本地验证模型路由

下面是一个可改造的最小 LiteLLM 配置。示例假设当前 LiteLLM 版本支持 Responses API,并使用 openai.gpt-oss-120b-1:0 作为 Bedrock 模型 ID;部署前应在目标 AWS 区域确认模型可用性、准确 ID 和访问授权。

# litellm-config.yaml
model_list:
  - model_name: codex-bedrock
    litellm_params:
      model: bedrock/openai.gpt-oss-120b-1:0
      aws_region_name: us-west-2

litellm_settings:
  success_callback:
    - prometheus
  failure_callback:
    - prometheus

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

在已经配置 AWS 凭证的开发机上,可以这样启动网关:

export AWS_REGION=us-west-2
export LITELLM_MASTER_KEY='replace-with-a-long-random-secret'

docker run --rm \
  -p 4000:4000 \
  -e AWS_REGION \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_SESSION_TOKEN \
  -e LITELLM_MASTER_KEY \
  -v "$PWD/litellm-config.yaml:/app/config.yaml:ro" \
  ghcr.io/berriai/litellm:main-stable \
  --config /app/config.yaml --port 4000

再用 Responses API 检查端到端链路:

curl --fail-with-body http://localhost:4000/v1/responses \
  -H "Authorization: Bearer $LITELLM_MASTER_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "codex-bedrock",
    "input": "Return only the result of 19 * 23."
  }'

本地测试中的 AWS 环境变量只用于快速验证。迁移到 Fargate 后,应删除这些变量,让 AWS SDK 自动取得 task role 的临时凭证。

把网关放进 ECS/Fargate

生产任务定义可以从下面的容器片段开始改造。镜像最好固定到经过验证的版本或 digest,而不是长期使用浮动标签;主密钥则从 AWS Secrets Manager 注入。

{
  "family": "litellm-gateway",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "1024",
  "memory": "2048",
  "executionRoleArn": "arn:aws:iam::123456789012:role/litellm-execution-role",
  "taskRoleArn": "arn:aws:iam::123456789012:role/litellm-bedrock-role",
  "containerDefinitions": [
    {
      "name": "litellm",
      "image": "ghcr.io/berriai/litellm:main-stable",
      "essential": true,
      "command": ["--config", "/app/config.yaml", "--port", "4000"],
      "portMappings": [
        {"containerPort": 4000, "protocol": "tcp"}
      ],
      "environment": [
        {"name": "AWS_REGION", "value": "us-west-2"}
      ],
      "secrets": [
        {
          "name": "LITELLM_MASTER_KEY",
          "valueFrom": "arn:aws:secretsmanager:us-west-2:123456789012:secret:litellm/master-key"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/litellm",
          "awslogs-region": "us-west-2",
          "awslogs-stream-prefix": "gateway"
        }
      }
    }
  ]
}

这个片段仍需补充配置文件的交付方式,例如构建进内部镜像,或在容器启动时从受控存储获取。不要把主密钥或数据库密码写入配置文件。

litellm-bedrock-role 应按实际模型和区域授予最小 Bedrock 推理权限。执行角色则只负责拉取镜像、读取 Secrets Manager 密钥和写入 CloudWatch Logs,两者不要混用。若启用 LiteLLM 虚拟密钥、预算和持久化消费记录,还需要为网关配置受支持的数据库,并将数据库连接串放入 Secrets Manager。

给 Codex 配置 Responses API

假设 ALB 地址是 https://llm.example.internal,可以在 Codex 配置中声明自定义模型提供方。不同 Codex 版本的字段可能变化,应用前应以当前版本的配置说明为准。

# ~/.codex/config.toml
model = "codex-bedrock"
model_provider = "litellm"

[model_providers.litellm]
name = "Company LiteLLM Gateway"
base_url = "https://llm.example.internal/v1"
env_key = "LITELLM_API_KEY"
wire_api = "responses"

然后只把分配给当前用户或自动化任务的虚拟密钥放入环境变量:

export LITELLM_API_KEY='replace-with-a-scoped-virtual-key'
codex

不要让普通 Codex 客户端使用 LiteLLM master key。主密钥用于网关管理,应由平台侧保管。实际的用户密钥可以限制为 codex-bedrock 模型,并配置预算周期、最大消费额、RPM、TPM 和失效时间。CI、个人开发机和共享服务账号也应使用不同密钥,避免审计记录混在一起。

遥测要覆盖网关与云端

网关至少需要记录请求数量、延迟、错误率、模型别名、调用身份和 token 使用量。Prometheus 回调可以提供 LiteLLM 侧指标,CloudWatch Logs 则负责收集 ECS 容器日志;Bedrock 和 AWS 审计数据用于回答“哪个 task role 在何时调用了什么资源”。

日志中不要记录完整提示词、生成结果或原始 Authorization 头。代码仓库可能通过 Codex 进入上下文,提示词遥测因此需要默认脱敏,并明确保留期限和访问范围。还应为 429、5xx、预算耗尽和 Bedrock 限流分别设置告警,因为这些故障的处理方式不同。

什么时候采用其他接入方式

直接通过 IAM Identity Center 访问适合 AWS 身份体系成熟、希望减少代理层,并且每位调用者都能获得受控 AWS 身份的团队。它缩短了请求链路,但跨模型预算、统一 API 密钥和网关级遥测需要在其他位置实现。

托管 Portkey 部署更适合希望减少网关运维工作、同时仍需策略和观测能力的团队。代价是引入额外供应商边界,需要评估数据路径、区域、合规、可用性和成本。

自管 LiteLLM 的优势是控制面掌握在自己手中,并能用一套兼容接口服务 Codex。相应地,团队必须负责升级、容量、数据库、密钥轮换、故障恢复和安全补丁。

上线前检查

  1. 确认目标 Bedrock 模型在部署区域可用,并完成所需的模型访问配置。
  2. 使用 ECS task role 调用 Bedrock,不在任务中保存长期 AWS 密钥。
  3. 通过 TLS 和网络边界保护 LiteLLM,只开放必要入口。
  4. 为个人、CI 和服务分别签发虚拟密钥,并配置模型范围、预算和限流。
  5. 固定 LiteLLM 镜像版本,测试 /v1/responses 与当前 Codex 版本的兼容性。
  6. 验证日志脱敏、指标采集、费用归属以及 429/5xx 告警。
  7. 在扩容前做并发和长上下文压测,确认 ALB 超时、ECS 健康检查与 Bedrock 配额匹配。

这类网关的价值最终体现在治理,而不是多增加一跳 HTTP。只有当身份、成本限制和可观测性一起落地时,它才真正适合承载团队级 Codex 流量。


相关推荐