Claude Code 接入 Amazon Bedrock 完整配置:从 IAM 到跑通的踩坑记录

上周团队里有同事问我:"Claude Code 能不能走公司的 AWS 账号?不想每个人单独订阅。"我一查,发现 Amazon Bedrock 早就支持了——模型调用走内网、计费进 AWS 账单、权限由 IAM 管控,确实适合团队统一管理。折腾了一下午终于跑通,把过程和踩的坑记下来。

为什么要走 Bedrock 而不是直连

先说结论,走 Amazon Bedrock 接入 Claude Code 有三个实际好处:

  1. 网络收敛到 AWS 内部——对有外网出口限制的企业环境,不用开额外的防火墙规则
  2. IAM 统一管控——可以按团队/项目分配不同模型的调用权限,新人入职建个 IAM 用户就行
  3. 审计和成本分摊——每次调用都进 CloudTrail,月底按 tag 分帐

说白了就是:个人用直连没问题,团队用 Bedrock 更省心。

整体链路

架构很简单,一句话说清楚:

本机 Claude Code 进程
  → 环境变量切换到 Bedrock 模式
  → AWS SigV4 签名
  → bedrock-runtime 端点
  → Cross-Region Inference Profile 自动路由

模型 ID 用跨区推理标识(比如 us.anthropic.claude-sonnet-4-6),Bedrock 会自动路由到可用区域。不用操心底层哪个 region 在跑。

第一步:确认模型可用

在配 IAM 之前,先去 Bedrock 控制台确认一下目标模型有没有开通。

  1. 登录 AWS 控制台,切到目标 region(我用的 us-west-2)
  2. 进 Amazon Bedrock → Foundation models → Model catalog
  3. 找到 Claude 模型卡片,点 "Open in Playground"
  4. 随便发条消息测试,能回复就说明链路通了

坑 1:有些模型在某些 region 还没上线。 如果 Playground 报 ValidationException,换个 region 试试。us-east-1 和 us-west-2 一般是最全的。

坑 2:模型需要申请访问。 第一次用某个模型,在 Model access 页面点 "Request access",通常几分钟就批。但有些模型(比如带 1M context 的)可能需要额外等。

第二步:建 IAM 用户 + 最小权限 Policy

别拿管理员账号的 AK/SK 配到本机。单独建个用户,挂最小权限:

# 建用户
aws iam create-user --user-name claude-code-bedrock

# 生成 AK/SK(Secret 只出现一次,马上记下来)
aws iam create-access-key --user-name claude-code-bedrock

最小权限 Policy 长这样:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InvokeClaudeModels",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:*::foundation-model/anthropic.*",
        "arn:aws:bedrock:*:*:inference-profile/us.anthropic.*",
        "arn:aws:bedrock:*:*:inference-profile/eu.anthropic.*"
      ]
    },
    {
      "Sid": "DiscoverModels",
      "Effect": "Allow",
      "Action": [
        "bedrock:ListFoundationModels",
        "bedrock:GetFoundationModel",
        "bedrock:ListInferenceProfiles",
        "bedrock:GetInferenceProfile"
      ],
      "Resource": "*"
    }
  ]
}

保存为 claude-code-bedrock-policy.json,然后:

# 创建 Policy
aws iam create-policy \
  --policy-name ClaudeCodeBedrockAccess \
  --policy-document file://claude-code-bedrock-policy.json

# 挂到用户上(换成你的 12 位账号 ID)
aws iam attach-user-policy \
  --user-name claude-code-bedrock \
  --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/ClaudeCodeBedrockAccess

坑 3:Resource 里的 inference-profile ARN 容易写错。 格式是 arn:aws:bedrock:*:*:inference-profile/us.anthropic.*,注意有两个通配符——region 和 account-id 都要 *

第三步:配置本机 credentials

把 AK/SK 写到单独的 profile,别污染默认 profile:

# ~/.aws/credentials
[claude-code]
aws_access_key_id = AKIAxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# ~/.aws/config
[profile claude-code]
region = us-west-2
output = json

验证一下权限是否生效:

# 列出可用的 Claude 模型
AWS_PROFILE=claude-code aws bedrock list-foundation-models \
  --region us-west-2 \
  --by-provider anthropic \
  --query "modelSummaries[?contains(modelId,'claude')].[modelId,modelLifecycle.status]" \
  --output table

# 列出跨区推理 profile
AWS_PROFILE=claude-code aws bedrock list-inference-profiles \
  --region us-west-2 \
  --query "inferenceProfileSummaries[?contains(inferenceProfileId,'anthropic')].[inferenceProfileId,status]" \
  --output table

再打一发真实请求确认能跑:

AWS_PROFILE=claude-code aws bedrock-runtime converse \
  --region us-west-2 \
  --model-id 'us.anthropic.claude-sonnet-4-6' \
  --messages '[{"role":"user","content":[{"text":"用一句话介绍你自己"}]}]' \
  --inference-config '{"maxTokens":128}'

能收到正常回复就 OK 了。

第四步:Claude Code 环境变量

Claude Code 通过环境变量识别后端。写个启动脚本 run-claude-bedrock.sh

#!/bin/bash
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_PROFILE=claude-code
export AWS_REGION=us-west-2
export ANTHROPIC_MODEL='us.anthropic.claude-sonnet-4-6'

exec claude

给执行权限:

chmod +x run-claude-bedrock.sh
./run-claude-bedrock.sh

启动后 Claude Code 会自动检测 Bedrock 连接状态。如果一切正常,你会看到模型名称显示为 Bedrock 模式下的 inference profile ID。

坑 4:CLAUDE_CODE_USE_BEDROCK=1 是关键变量。 没设这个,Claude Code 还是走直连后端。

坑 5:model ID 用 inference profile 前缀。 比如 us.anthropic.claude-sonnet-4-6,不要用裸模型 ID anthropic.claude-sonnet-4-6-v1。后者在某些 region 不支持 on-demand 调用,会报 ValidationException

第五步:验证和常见错误排查

启动 Claude Code 后,随便问它一个问题。如果正常回复,恭喜配置完成。

如果报错,参考这个排查表:

错误信息 原因 解决
AccessDeniedException: not authorized to perform bedrock:InvokeModel Policy 没覆盖目标模型 ARN 检查 Resource 里是否包含对应的 inference-profile 前缀
ValidationException: Invocation of model ID … isn't supported 该 region 不支持 on-demand,只支持 inference profile 换成 us./eu. 前缀的跨区推理 ID
ThrottlingException TPS/TPM 配额不够 去 Service Quotas 申请提升
You don't have access to the model 模型没在 Model access 里批准 回控制台申请 access

进阶:团队多人使用

如果团队有 5-10 个开发者都要用,建议:

  1. 用 IAM Identity Center(SSO)——每人一个 SSO session,不用管理 AK/SK
  2. 按团队创建不同 Policy——前端只给 Sonnet,后端给 Opus,按需控制
  3. 设置 Budgets 告警——Bedrock 按 token 计费,月初设个预算上限

配合 CloudTrail,可以精确追踪每个人每天调了多少次、用了多少 token,月底按 Cost Allocation Tag 分帐。

小结

整个配置流程:

  1. Bedrock 控制台确认模型可用
  2. 建 IAM 用户 + 最小权限 Policy
  3. 本机 credentials 配独立 profile
  4. CLI 验证调用链路
  5. 设环境变量启动 Claude Code

我实际花了大概 40 分钟跑通(主要卡在 inference profile 的 ARN 格式上)。如果你的团队正在考虑统一管理 AI 编程工具的接入方式,Bedrock 这条路值得试。


参考资料:

posted @ 2026-06-03 07:30  亚马逊云开发者  阅读(95)  评论(0)    收藏  举报