AWS 给出两种把 Claude Code 的 Bedrock 推理固定在伦敦区域的方法:应用推理配置文件或 Mantle 端点,并配合 IAM 区域条件限制。还可借助 CloudTrail 验证请求是否满足数据驻留要求。
一家总部位于美国的全球性组织最近向我们提出了一个看似简单的数据驻留要求:允许其工程师使用 Claude Code。具体要求是:Amazon Bedrock 模型推理必须在伦敦(AWS 区域 eu-west-2)完成处理,而不仅仅是从伦敦发起调用。他们的合规团队划定了严格的红线:提示词、补全结果和中间处理过程都必须保留在单个 AWS 区域内。不接受近似合规。
我们首先尝试了最新的方案——Amazon Bedrock 上的 Anthropic Mantle 端点,但遇到了限制。随后,我们转回经典的 Amazon Bedrock Invoke API,并配合应用程序推理配置文件使用。这个组合再加上 AWS Identity and Access Management(IAM)区域条件,满足了该要求。
本文将介绍这两种方案、为什么方案选择取决于你的区域、用于强制执行区域限制的 AWS Identity and Access Management(IAM)策略,以及如何在 AWS CloudTrail 中验证合规性。此模式适用于以 Amazon Bedrock 模型 ID 为目标的工具。
重要背景:对于大多数 Amazon Bedrock 工作负载,跨区域推理(CRIS)是正确的默认选择。它可以平滑吞吐量、提高应用程序可用的容量,并让你优先使用较新的模型。仅当你的合规要求指定的是某个特定 AWS 区域,而不是某个地理范围时,才应使用本文介绍的单区域模式。如果“欧盟境内的任意位置”就能满足你的数据驻留需求,那么使用 EU 跨区域配置文件是更直接的方案。
开始之前,请确认你具备以下条件:
一个已为计划使用的 Claude 模型启用 Amazon Bedrock 模型访问权限的 AWS 账户。
Claude Code 运行身份所需的 IAM 权限,不同方案需要的权限有所不同:方案 1(Mantle):bedrock-mantle:CreateInference、bedrock-mantle:Get* 和 bedrock-mantle:List*。方案 2(经典 Amazon Bedrock):bedrock:CreateInferenceProfile、bedrock:InvokeModel 和 bedrock:InvokeModelWithResponseStream。两种方案都需要:iam:CreatePolicy、iam:AttachRolePolicy 和 iam:PutRolePolicy,以便将限定区域的策略附加到相应角色或用户。
方案 1(Mantle):bedrock-mantle:CreateInference、bedrock-mantle:Get* 和 bedrock-mantle:List*。
方案 2(经典 Amazon Bedrock):bedrock:CreateInferenceProfile、bedrock:InvokeModel 和 bedrock:InvokeModelWithResponseStream。
两种方案都需要:iam:CreatePolicy、iam:AttachRolePolicy 和 iam:PutRolePolicy,以便将限定区域的策略附加到相应角色或用户。
Claude Code v2.1.94 或更高版本(方案 1 需要 Mantle 支持,该支持从 v2.1.94 开始提供)。
已安装 AWS Command Line Interface(AWS CLI),并使用目标区域的凭证完成配置。
Amazon Bedrock 通过两个不同的端点提供 Claude 模型。你使用的端点决定了如何强制执行数据驻留,也决定了可以在哪些区域实施这种限制。
经典 Amazon Bedrock(bedrock-runtime)是最初的 Amazon Bedrock Invoke API。当你设置 CLAUDE_CODE_USE_BEDROCK=1 时,Claude Code 会使用该端点。单区域路由需要推理配置文件。默认情况下,系统定义的推理配置文件都是跨区域的。要将请求限制在一个区域内,你需要创建一个应用程序推理配置文件,并将其指向该区域内的基础模型。
Mantle(bedrock-mantle)是一个较新的 Amazon Bedrock 端点,它通过 Anthropic 原生 API 的形式提供 Claude。当你设置 CLAUDE_CODE_USE_MANTLE=1 时,Claude Code 会使用该端点。Mantle 原生支持单区域路由。你只需设置 AWS_REGION,Mantle 就会直接将端点解析到该区域,无需应用程序推理配置文件。
图 1:Claude Code 单区域部署的两种方案
不过,每个端点都有自己的区域可用性和模型阵容:
Claude Code 可以在同一个会话中同时使用这两个端点(同时设置两个环境变量)。以 anthropic. 开头且没有 us. 前缀的模型 ID 会路由到 Mantle。其他所有模型 ID 都会路由到经典 Invoke。
你的目标区域决定了方案选择。目标是伦敦(eu-west-2)?使用方案 2。Mantle 在那里不提供区域内路由,而经典 Amazon Bedrock 支持 Claude Opus 4.6 和 Sonnet 4.6 的区域内推理。目标是爱尔兰、斯德哥尔摩、东京、墨尔本、美国东部(弗吉尼亚北部)、美国东部(俄亥俄州)或美国西部(俄勒冈州)中的某个区域?使用方案 1。Mantle 的原生路由在这些区域可用,并能以更少的配置提供较新模型。目标是其他区域?目前两种模式都无法使用。请联系你的 AWS 客户团队进行升级处理。
有关各区域的模型可用性,请参阅 Amazon Bedrock 中按 AWS 区域划分的受支持模型。
如果你的合规要求指向 Mantle 支持区域内路由的七个区域之一——爱尔兰、斯德哥尔摩、东京、墨尔本、美国东部(弗吉尼亚北部)、美国东部(俄亥俄州)或美国西部(俄勒冈州),那么 Mantle 是更直接的方案。你无需创建任何推理配置文件,即可获得直接的单区域路由,并能使用包括 Claude Sonnet 5 在内的较新模型。
配置 Claude Code 以使用 Mantle,并将其固定到目标区域:
# Route Claude Code through the Mantle endpoint
# Ireland, an in-Region Mantle Region
export CLAUDE_CODE_USE_MANTLE=1
export AWS_REGION=eu-west-1
# Pin the model family aliases to Mantle model IDs
export ANTHROPIC_DEFAULT_OPUS_MODEL='anthropic.claude-opus-4-8'
export ANTHROPIC_DEFAULT_SONNET_MODEL='anthropic.claude-sonnet-5'
export ANTHROPIC_DEFAULT_HAIKU_MODEL='anthropic.claude-haiku-4-5'
运行 claude 命令并检查 /status 输出。提供商应显示为 Amazon Bedrock (Mantle),且区域应与目标区域一致。Claude Code v2.1.94 及更高版本支持 Mantle。
配置概要:三个环境变量,除 IAM 策略外,无需预置其他 AWS 资源。
Claude Code 本身不持有任何凭证。它会使用开发人员环境中已有的 AWS 凭证对 Amazon Bedrock 调用进行签名。请将以下策略附加到对应的 IAM 主体:开发人员代入的角色(例如通过 AWS IAM Identity Center),或者其本地配置文件背后的 IAM 用户。该策略只允许在目标区域调用 Amazon Bedrock:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowClaudeCodeMantleInIrelandOnly",
"Effect": "Allow",
"Action": [
"bedrock-mantle:CreateInference",
"bedrock-mantle:Get*",
"bedrock-mantle:List*"
],
"Resource": "arn:aws:bedrock-mantle:eu-west-1:111122223333:project/*",
"Condition": {
"StringEquals": {
"aws:RequestedRegion": "eu-west-1"
}
}
}
]
}
将 111122223333 替换为你的账户 ID。aws:RequestedRegion 条件会拒绝任何不是针对爱尔兰端点发起的 Mantle 调用。因此,即使开发人员错误配置了 AWS_REGION,IAM 也会拒绝该调用。这就是本文讨论的区域护栏。请注意,Mantle 上的模型固定机制有所不同:资源是项目,而不是模型,因此身份策略只能控制区域。模型选择由 ANTHROPIC_DEFAULT_*_MODEL 变量决定。要强制执行已批准的模型列表,请使用服务控制策略。这是它与方案 2 的不对称之处:在方案 2 中,基础模型 Amazon Resource Name(ARN)允许通过一条身份策略同时固定区域和模型。
我们客户的合规要求明确指定了伦敦,而 Mantle 的区域可用性表说明了这为什么很重要。eu-west-2 上的 Mantle 仅提供 Global 和 EU 端点,没有仅限区域内的选项。EU 端点会在整个欧盟地理范围内进行路由,因此从伦敦发出的请求可能会在法兰克福、爱尔兰或巴黎处理。这正是客户需要避免的情况。
对于伦敦,经典 Amazon Bedrock 是唯一选择。此外还有一项限制:经典 Amazon Bedrock 的区域内可用性范围很窄。
根据 Claude Opus 4.6 和 Claude Sonnet 4.6 的模型卡,eu-west-2 目前是唯一为这些模型提供区域内推理的区域。Opus 4.7 和 4.8 不支持这种方式。它们在经典 Amazon Bedrock 上仅支持 Geo。因此,伦敦部署需要以 Claude Opus 4.6 和 Sonnet 4.6 为基础。
某些基础模型无法通过其模型 ID 直接调用,因为 Amazon Bedrock 要求必须通过推理配置文件调用它们。因此,当你让 Claude Code 直接使用这些模型 ID 时,调用会失败。Amazon Bedrock 会返回错误,指出不支持按需吞吐量,并要求你改用推理配置文件的 ID 或 ARN 重试。但是,系统定义的推理配置文件都是跨区域配置文件(带有 eu. 和 global. 前缀),这恰恰是我们要避免的情况。
解决方案是使用应用程序推理配置文件。这是一种由你创建的配置文件,以某个区域中的基础模型 ARN 作为模型来源。将它指向伦敦的基础模型 ARN,就能得到一个 Claude Code 可以接受的配置文件形式 ARN,并且该 ARN 会解析到单区域模型。
为每个模型系列创建一个配置文件:
aws bedrock create-inference-profile \
--region eu-west-2 \
--inference-profile-name "claude-code-opus-london" \
--model-source copyFrom="arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-opus-4-6-v1"
aws bedrock create-inference-profile \
--region eu-west-2 \
--inference-profile-name "claude-code-sonnet-london" \
--model-source copyFrom="arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-sonnet-4-6"
每次调用都会返回一个类似 arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<id> 的 inferenceProfileArn。请保存这两个 ARN。Claude Code 会将它们用作模型。应用程序推理配置文件还支持在 AWS 账单中按配置文件跟踪成本和用量。
将 Claude Code 连接到这些配置文件 ARN:
# Route Claude Code through classic Bedrock in London
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=eu-west-2
# Map the model aliases to the London application inference profiles
export ANTHROPIC_DEFAULT_OPUS_MODEL='arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<opus-id>'
export ANTHROPIC_DEFAULT_SONNET_MODEL='arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<sonnet-id>'
面向团队部署时,应将这些设置写入托管设置文件,而不是分别配置在每位工程师的 shell 中,从而确保配置一致并由中心统一管控。
设置摘要:创建 2 个应用程序推理配置文件(每个模型系列一个)、设置四个环境变量(CLAUDE_CODE_USE_BEDROCK、AWS_REGION 以及两个 ANTHROPIC_DEFAULT_*_MODEL 变量),再加上 IAM 策略。与路径 1 相比,每个模型系列大约需要额外 5 分钟的预置时间。
IAM 策略与路径 1 类似,但 Resource 列表现在包含应用程序推理配置文件 ARN、其底层基础模型 ARN,以及 Amazon Bedrock 所需的 IAM 操作:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowClaudeCodeInLondonOnly",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock:GetInferenceProfile",
"bedrock:ListInferenceProfiles"
],
"Resource": [
"arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<opus-id>",
"arn:aws:bedrock:eu-west-2:<account-id>:application-inference-profile/<sonnet-id>",
"arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-opus-4-6-v1",
"arn:aws:bedrock:eu-west-2::foundation-model/anthropic.claude-sonnet-4-6"
],
"Condition": {
"StringEquals": {
"aws:RequestedRegion": "eu-west-2"
}
}
}
]
}
执行端到端验证。在 Claude Code 中运行 /status,确认提供商显示为 Amazon Bedrock,并且区域为伦敦。
Claude Code 对 Amazon Bedrock 的每一次调用都必须出现在目标区域的 AWS CloudTrail 中,并且不得出现在其他任何区域。具体查询方式取决于你部署的路径,因为这两个端点使用不同的事件名称、事件源和 CloudTrail 事件类型进行记录。
路径 2(经典 Amazon Bedrock):模型调用会以 InvokeModel 的名称记录在 bedrock.amazonaws.com 事件源下。可在事件历史记录中查询:
aws cloudtrail lookup-events \
--region eu-west-2 \
--lookup-attributes AttributeKey=EventName,AttributeValue=InvokeModel
合规事件包含三个关键字段:
{
"eventName": "InvokeModel",
"eventSource": "bedrock.amazonaws.com",
"awsRegion": "eu-west-2",
"requestParameters": {
"modelId": "arn:aws:bedrock:eu-west-2:111122223333:application-inference-profile/opus-london"
}
}
如果没有出现任何 InvokeModel 事件,则可能尚未开启模型调用日志记录。请在跟踪中启用 Amazon Bedrock 数据事件,然后重试。
路径 1(Mantle):Mantle 将推理记录为 bedrock-mantle.amazonaws.com 事件源下的 CreateInference,其类型为 CloudTrail 数据事件。在进行验证之前,需要先通过跟踪或事件数据存储中的高级事件选择器启用 bedrock-mantle 数据事件。启用日志记录后,在 AWS CloudTrail Lake 中查询事件数据存储:
SELECT eventName, awsRegion, element_at(requestParameters, 'model') AS model
FROM <event-data-store-id>
WHERE eventSource = 'bedrock-mantle.amazonaws.com'
AND eventName = 'CreateInference'
合规的 Mantle 事件会在 awsRegion 中携带目标区域,并在 requestParameters.model 中携带固定的模型:
{
"eventName": "CreateInference",
"eventSource": "bedrock-mantle.amazonaws.com",
"awsRegion": "eu-west-1",
"requestParameters": {
"model": "anthropic.claude-sonnet-5"
}
}
无论选择哪条路径,都可以通过三项检查证明其合规性。第一,每个事件的 awsRegion 都必须与目标区域匹配。第二,在其他所有区域中重新运行相同查询时,结果都应为零。第三,任何包含 errorCode: AccessDenied 的事件都应追溯到刻意执行的测试,而不是实际客户端请求。
对两条路径进行比较:
在做出决定之前,请在 Amazon Bedrock 模型卡片上核实当前的区域内可用状态。随着新模型陆续上线,可用性也会发生变化。
如果要移除已创建的应用程序推理配置文件,请使用 AWS CLI 将其删除:
aws bedrock delete-inference-profile \
--region eu-west-2 \
--inference-profile-identifier <opus-profile-arn>
aws bedrock delete-inference-profile \
--region eu-west-2 \
--inference-profile-identifier <sonnet-profile-arn>
应用程序推理配置文件本身不会产生持续费用,成本来自模型调用。移除不再使用的配置文件有助于保持账户整洁,并降低意外调用的风险。由于路径 1 不会创建额外的 AWS 资源,因此除了分离 IAM 策略外,无需执行其他清理操作。
请将本文内容视为某一时间点的快照。随着 Anthropic 和 AWS 在这两个端点中将新模型扩展到更多区域,区域可用性也会发生变化。在正式部署之前,请通过模型卡片确认所选模型当前的区域内可用状态及其准确的模型 ID。
Claude Code 可以在同一会话中使用这两个端点。同时设置 CLAUDE_CODE_USE_BEDROCK=1 和 CLAUDE_CODE_USE_MANTLE=1 后,符合 Mantle 格式的模型 ID 会路由到 Mantle,其他模型 ID 则会路由到经典 Invoke。这在迁移期间,或不同模型系列分别位于不同端点时非常有用。
为 AI 智能体编程工具实现单区域数据驻留,看起来似乎需要自定义基础设施,实际上并非如此。你可以根据所在区域,选择 Mantle 的原生单区域路由,或经典 Amazon Bedrock 应用程序推理配置文件。无论选择哪种方式,再配合 IAM 区域条件,即可实现简洁且可审计的 Claude Code 部署。
要开始使用,请打开 Amazon Bedrock 控制台,检查两个端点上所需模型的区域可用性表,并选择适合所在区域的路径。有关推理配置文件、跨区域推理以及 Amazon Bedrock 上的 Claude Code 的更多信息,请参阅各自的文档。
如需通过 OpenID Connect(OIDC)联合身份验证、IAM Identity Center 集成和可观测性进行企业级 Claude Code 部署,请参阅 Claude Apps Gateway 代码仓库。
有关参考架构模式,请查看 AWS Solutions Library 中的 Guidance for Claude Code on Amazon Bedrock,其中还包含配套的 GitHub 代码仓库。
如需通过提示词缓存优化 Claude Code 的成本和延迟,请参阅 Supercharge your development with Claude Code and Amazon Bedrock prompt caching。