跨账户 SigV4、工作区级 API Key、OIDC 联邦三种接入方式详解,适合企业 AI 平台管理员。
你需要在三个环境中使用 AWS 上的 Claude Platform(CPonAWS)进行推理:生产工作负载在 AWS 上,开发者笔记本用于本地迭代,外部服务则运行在其他云提供商或本地的持续集成和持续交付(CI/CD)流水线中。每个环境有不同的身份验证要求,但都应共享同一个订阅,并通过工作空间级别隔离生产流量和开发流量。对于有更多环境的组织,为每个团队或工作负载创建一个工作空间,并为其重复跨账户角色模式。
本文将带你完成完整的设置。你将在组织内部署一个专用的 AI Services 账户,并为其配置跨账户 SigV4 以支持 AWS 工作负载。你还将为开发者生成作用域限定的 API 密钥,并为外部环境配置 OIDC 联合身份验证。每个步骤都包含 CLI 命令、控制台说明或代码片段。如果你在评估哪种账户结构适合你的组织,或者哪种身份验证路径适合你的工作负载,请参阅相关架构模式和身份验证路径文章。本文承接那些决策之后的部分:完整、分步的实施指南。
专用 AI Services 账户模式将 CPonAWS 订阅放在组织内的专用 AI Services 链接账户中。该账户拥有订阅、工作空间、API 密钥和跨账户角色。工作负载账户不直接操作订阅:它们在 AI Services 账户中承担角色来发起推理调用。结果形成三账户结构:一个用于账单和治理的付款人(管理)账户,一个托管 CPonAWS 订阅和工作空间的 AI Services 账户,以及一个或多个通过跨账户角色消费推理的工作负载账户,如下图所示。
图 1:采用专用 AI Services 账户的 Claude Platform on AWS 多账户拓扑
上图展示了高级账户拓扑结构。下图展示了我们要构建的具体实现,包括 AWS Identity and Access Management(IAM)角色、访问路径和工作空间映射:
图 2:本指南实现的三种访问模式
我们将配置三种访问模式:
通过跨账户 SigV4 的 AWS 工作负载账户:托管在工作负载账户中 Amazon Elastic Kubernetes Service(Amazon EKS)上的 Pod 在 AI Services 账户中承担一个角色,然后发起经 SigV4 签名的推理调用。不存储 API 密钥,无需轮换密钥。
通过工作空间作用域 API 密钥的开发者笔记本:锁定到开发工作空间的长期 API 密钥。开发者可在本地配合标准 Anthropic SDK 使用。
通过 OpenID Connect(OIDC)联合身份验证和短期密钥的外部工作负载:托管在 AWS 外部的工作负载通过 OIDC 进行身份验证,获取临时 AWS 凭证。它生成短期令牌并发起推理调用,无需持久化凭证。
开始之前,请确认你具备以下条件:
AWS Organizations 中的一个组织,包含:一个付款人(管理)账户。一个用于 AI Services 订阅的 AWS 链接账户(将托管 CPonAWS 订阅)。一个用于托管工作负载的 AWS 链接账户(例如"生产环境")。
AWS CLI v2 已安装,并为两个账户配置了命名配置文件。
Python 3.12+,并安装了以下包:anthropic[aws]、boto3、token-generator-for-aws-external-anthropic。
本实操指南分为四个部分。每部分配置架构的一层:CPonAWS 订阅和工作空间结构、AWS 工作负载的跨账户 SigV4 访问、开发者的作用域 API 密钥,以及外部环境的 OIDC 联合身份验证。请按顺序完成。每个部分都建立在前一部分创建的资源之上。
占位符参考
在整个指南中,请将这些占位符替换为你的实际值:
第 1 部分:设置 AI Services 账户
按照Introducing Claude Platform on AWS指南为你的 AI Services 账户订阅 CPonAWS。订阅完成后,创建两个工作空间以隔离生产流量和开发流量:
访问 AI Services 账户中的 AWS Management Console,导航至 Claude Platform on AWS。
导航至 Access,以 Admin 身份登录。
在 Claude Console 中,选择左上角的下拉菜单,选择 Create Workspace。输入名称 production,然后选择 Create。
图 3:Claude Console 仪表板,展示如何创建工作空间
记录工作空间 ARN(例如 wrkspc_PROD)。
重复以上步骤,创建第二个名为 development 的工作空间(例如 wrkspc_DEV)。
提示:现在记录两个工作空间 ARN。你将在整个指南的 IAM 策略和代码中引用它们。工作空间在特定的 AWS 区域中创建,你的 API 调用必须针对相应的区域端点(例如 aws-external-anthropic.us-east-1.api.aws)。请注意,工作空间区域决定了 API 端点,而不是推理运行的位置。推理地域通过 Claude Console 中工作空间的 Security 设置单独控制。当前选项为"US"和"Global routing"。对于短期密钥,在生成和使用时会强制执行此限制:令牌只能在与生成时相同的区域端点上使用。长期 API 密钥不受区域锁定限制。关于支持的区域和可用模型,请参阅 Claude Platform on AWS User Guide 中的 Supported Regions and models。
第 2 部分:AWS 工作负载的跨账户 SigV4
本节配置工作负载账户中的 EKS Pod(或其他工作负载)通过 SigV4 签名发起推理调用。工作负载承担 AI Services 账户中的一个角色,该角色仅授予对生产工作空间的访问权限。
2.1 创建跨账户角色(AI Services 账户)
首先,在 AI Services 账户中创建信任策略文件。这允许工作负载账户中的特定角色承担跨账户角色。
在 AI Services 账户中访问 AWS Management Console,打开 AWS CloudShell。
将以下文件保存为 trust-policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::WORKLOAD_ACCOUNT_ID:role/EKS-Pod-Role"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalOrgID": "YOUR_ORG_ID"
}
}
}
]
}
通过运行以下命令创建角色:
# From the AI Services account profile
aws iam create-role \
--role-name CrossAccount-ClaudePlatform-Prod \
--assume-role-policy-document file://trust-policy.json \
--description "Allows workload account to invoke CPonAWS production workspace" \
--profile ai-services
2.2 附加权限策略(AI Services 账户)
将以下文件保存为 permission-policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CPonAWSInference",
"Effect": "Allow",
"Action": [
"aws-external-anthropic:CreateInference",
"aws-external-anthropic:CountTokens",
"aws-external-anthropic:GetModel",
"aws-external-anthropic:ListModels"
],
"Resource": "arn:aws:aws-external-anthropic:YOUR_REGION:AI_SERVICES_ACCOUNT_ID:workspace/WORKSPACE_PROD_ID"
},
{
"Sid": "CPonAWSResourceless",
"Effect": "Allow",
"Action": "aws-external-anthropic:GetAccountStatus",
"Resource": "*"
},
{
"Sid": "STSWebIdentity",
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken", "sts:TagGetWebIdentityToken"],
"Resource": "*"
}
]
}
将策略附加到角色:
aws iam put-role-policy \
--role-name CrossAccount-ClaudePlatform-Prod \
--policy-name CPonAWS-Inference-Prod \
--policy-document file://permission-policy.json \
--profile ai-services
注意:CreateInference 的作用域限定为 WORKSPACE_PROD_ID 工作空间 ARN。此角色无法访问开发工作空间或账户中的其他工作空间。
2.3 授予 AssumeRole 权限(Workload 账户)
工作负载账户中的 EKS Pod 角色需要获得承担跨账户角色的权限。首先创建策略。
在 Workload 账户中访问 AWS Management Console,打开 AWS CloudShell。
将以下文件保存为 allow-assume-cponaws.json。
创建并附加策略。
aws iam create-policy \
--policy-name AllowAssumeCPonAWSRole \
--policy-document file://allow-assume-cponaws.json \
--profile workload-prod
aws iam attach-role-policy \
--role-name EKS-Pod-Role \
--policy-arn arn:aws:iam::WORKLOAD_ACCOUNT_ID:policy/AllowAssumeCPonAWSRole \
--profile workload-prod
2.4 测试(从 Workload 账户)
在配有 EKS-Pod-Role 凭证的机器上(或 pod 中)运行以下 Python 脚本。
import boto3, os
from anthropic import AnthropicAWS
# Assume the cross-account role in the AI Services account
sts = boto3.client("sts")
assumed = sts.assume_role(
RoleArn="arn:aws:iam::AI_SERVICES_ACCOUNT_ID:role/CrossAccount-ClaudePlatform-Prod",
RoleSessionName="prod-workload"
)
creds = assumed["Credentials"]
os.environ["AWS_ACCESS_KEY_ID"] = creds["AccessKeyId"]
os.environ["AWS_SECRET_ACCESS_KEY"] = creds["SecretAccessKey"]
os.environ["AWS_SESSION_TOKEN"] = creds["SessionToken"]
# Make an inference call
client = AnthropicAWS(aws_region="YOUR_REGION", workspace_id="WORKSPACE_PROD_ID")
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[{"role": "user", "content": "Hello from the workload account!"}]
)
print(resp.content[0].text)
第 3 部分:面向开发者访问的工作区级 API 密钥
开发者可以使用 API 密钥从个人笔记本电脑调用 Claude,无需配置跨账户角色链。在下一节中,你将生成一个密钥、将其限定在开发工作区,并验证隔离效果。
3.1 生成 API 密钥(AI Services 账户)
登录 AI Services 账户的 AWS Management Console。
导航到 Claude Platform on AWS,然后进入 API keys。
选择 Generate long-term key,选择 API 密钥过期时间,然后选择 Generate。
立即复制密钥值(安全存储:你将无法再次查看它)。
图 4:从 Claude Console(API Keys 页面)生成具有可配置过期时间的长期限 API 密钥
3.2 将密钥限定为开发工作区(AI Services 账户)
默认情况下,生成密钥的后备 IAM 用户(AeaApiKey-*)附加了 AnthropicLimitedAccess 托管策略。该策略授予对所有工作区的访问权限。要强制执行工作区隔离:
在 AWS Management Console(AI Services 账户)中,导航到 IAM,然后转到 Users。
搜索以 AeaApiKey- 开头的用户。
找到最近创建的用户(创建时间戳应与你生成密钥的时间一致)。
选择该用户,然后选择 Permissions 选项卡。
选择 AnthropicLimitedAccess 策略,然后选择 Remove 以分离托管策略。
选择 Add permissions,然后选择 Create inline policy。
切换到 JSON 选项卡并粘贴以下内容。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "InferenceDevWorkspaceOnly",
"Effect": "Allow",
"Action": [
"aws-external-anthropic:CreateInference",
"aws-external-anthropic:CountTokens"
],
"Resource": "arn:aws:aws-external-anthropic:YOUR_REGION:AI_SERVICES_ACCOUNT_ID:workspace/wrkspc_DEV"
},
{
"Sid": "BearerTokenAndStatus",
"Effect": "Allow",
"Action": [
"aws-external-anthropic:CallWithBearerToken",
"aws-external-anthropic:GetAccountStatus"
],
"Resource": "*"
},
{
"Sid": "STSWebIdentity",
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken", "sts:TagGetWebIdentityToken"],
"Resource": "*"
}
]
}
将策略命名为 CPonAWS-DevWorkspace-Only,然后选择 Create policy。
3.3 向开发团队分发密钥(Workload 账户或开发者环境)
管理员将限定了范围的 API 密钥分发给开发团队。将密钥存储在团队首选的密钥管理解决方案中。对于基于 AWS 的团队,将其存储在工作负载或开发者 AWS 账户内的 AWS Secrets Manager 中:
aws secretsmanager create-secret \
--name cponaws/dev-api-key \
--secret-string "YOUR_API_KEY_VALUE" \
--region YOUR_REGION \
--profile workload-prod
注意:API 密钥是自验证的。无论从哪个 AWS 账户(或非 AWS 环境)调用,它都能正常工作。请将其存储在开发者可以安全检索的位置。
3.4 测试(从开发者笔记本电脑)
从配置了与上一步创建密钥所在账户相同配置文件的笔记本电脑上运行以下代码。
import boto3
from anthropic import Anthropic
# Retrieve the API key from Secrets Manager
secrets = boto3.client('secretsmanager', region_name='YOUR_REGION')
api_key = secrets.get_secret_value(SecretId='cponaws/dev-api-key')['SecretString']
# Create the client pointing to the CPonAWS endpoint
client = Anthropic(
api_key=api_key,
base_url='https://aws-external-anthropic.YOUR_REGION.api.aws'
)
# Make an inference call to the development workspace
resp = client.messages.create(
model='claude-sonnet-4-6',
max_tokens=128,
messages=[{"role": "user", "content": "Hello from my laptop!"}],
extra_headers={'anthropic-workspace-id': 'WORKSPACE_DEV_ID'}
)
print(resp.content[0].text)
预期输出:来自 Claude 的响应,确认开发工作区可访问。
3.5 验证工作区隔离(从开发者笔记本电脑)
确认开发密钥无法访问生产工作区。
# Attempt to call the production workspace with the dev key
try:
resp = client.messages.create(
model='claude-sonnet-4-6',
max_tokens=32,
messages=[{"role": "user", "content": "test"}],
extra_headers={'anthropic-workspace-id': 'wrkspc_PROD'}
)
print("ERROR: Key accessed production workspace!")
except Exception as e:
print(f"GOOD: Access denied as expected - {e}")
预期输出:GOOD: Access denied as expected,后跟一个权限错误。如果密钥成功访问了生产工作区,请重新检查步骤 3.2 并确认托管策略已被分离。
第 4 部分:面向外部工作负载的 OIDC 联合认证
对于运行在 Google Cloud Platform(GCP)、AWS 外部 Kubernetes 集群或 CI/CD 流水线(GitHub Actions、GitLab CI)上的工作负载,OIDC 联合认证可以在不存储 AWS 凭证的情况下完成身份验证。流程如下:外部身份提供商发放令牌,然后 AWS Security Token Service(STS)将其交换为临时凭证。这些凭证随后生成一个短期有效的 CPonAWS bearer token。
4.1 创建 IAM OIDC 身份提供商(AI Services 账户)
在你的 AI Services 账户中为外部工作负载的发行方配置一个 IAM OIDC 身份提供商。例如,对于 GCP 工作负载,请参阅访问 AWS using a Google Cloud Platform native workload identity 指南以获取完整设置。
4.2 为外部工作负载创建角色(AI Services 账户)
在 AI Services 账户中访问 AWS Management Console,然后打开 AWS CloudShell。
另存为 oidc-trust-policy.json。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::AI_SERVICES_ACCOUNT_ID:oidc-provider/YOUR_OIDC_ISSUER"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"YOUR_OIDC_ISSUER:aud": "sts.amazonaws.com"
},
"StringLike": {
"YOUR_OIDC_ISSUER:sub": "YOUR_WORKLOAD_IDENTITY_FILTER"
}
}
}
]
}
aws iam create-role \
--role-name OIDC-ClaudePlatform-Prod \
--assume-role-policy-document file://oidc-trust-policy.json \
--description "Allows external OIDC workloads to invoke CPonAWS production workspace" \
--profile ai-services
将权限策略另存为 oidc-permission-policy.json。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CPonAWSInference",
"Effect": "Allow",
"Action": [
"aws-external-anthropic:CreateInference",
"aws-external-anthropic:CountTokens",
"aws-external-anthropic:GetModel",
"aws-external-anthropic:ListModels"
],
"Resource": "arn:aws:aws-external-anthropic:YOUR_REGION:AI_SERVICES_ACCOUNT_ID:workspace/WORKSPACE_PROD_ID"
},
{
"Sid": "CPonAWSResourceless",
"Effect": "Allow",
"Action": [
"aws-external-anthropic:CallWithBearerToken",
"aws-external-anthropic:GetAccountStatus"
],
"Resource": "*"
},
{
"Sid": "STSWebIdentity",
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken", "sts:TagGetWebIdentityToken"],
"Resource": "*"
}
]
}
aws iam put-role-policy \
--role-name OIDC-ClaudePlatform-Prod \
--policy-name CPonAWS-OIDC-Inference-Prod \
--policy-document file://oidc-permission-policy.json \
--profile ai-services
重要提示:CallWithBearerToken 必须在 Resource: "*" 上授权。将其限定到工作区 ARN 会导致所有令牌生成调用失败。CreateInference 保持限定在工作区 ARN 以实现隔离:生成的令牌会继承工作区限制。
在外部工作负载通过 OIDC 获取了 AWS 凭证之后(完整的凭证交换流程参见使用 Google Cloud Platform 原生工作负载身份访问 AWS):
from token_generator_for_aws_external_anthropic import TokenGenerator
from anthropic import Anthropic
from datetime import timedelta
# 第 1 步:生成短期令牌(需要 OIDC 假设角色的 AWS 凭证)
generator = TokenGenerator(region='YOUR_REGION')
token = generator.get_token(expiry=timedelta(hours=1))
# 第 2 步:使用令牌(此后不再需要 AWS 凭证)
client = Anthropic(
api_key=token,
base_url='https://aws-external-anthropic.YOUR_REGION.api.aws'
)
resp = client.messages.create(
model='claude-sonnet-4-6',
max_tokens=128,
messages=[{"role": "user", "content": "Hello from GCP via OIDC!"}],
extra_headers={'anthropic-workspace-id': 'wrkspc_PROD'}
)
print(resp.content[0].text)
关键点:生成的令牌在 1 小时后过期(可配置,最长 12 小时)。生成后,令牌是一个独立的持有者凭证:外部工作负载在发出推理调用时不再需要 AWS 凭证。对于持续运行的服务(例如 GCP Cloud Run 容器),需要在令牌到期前刷新以实现令牌续期。
如果你正在评估阶段,为避免产生持续费用:
撤销 API 密钥:在 AWS Management Console 中,导航至 Claude Platform on AWS,API keys。删除所有已生成的密钥。
删除底层 IAM 用户:导航至 IAM > Users,搜索 AeaApiKey-*,删除由密钥生成流程创建的任何用户。
# 先删除内联策略,再删除角色
aws iam delete-role-policy \
--role-name CrossAccount-ClaudePlatform-Prod \
--policy-name CPonAWS-Inference-Prod \
--profile ai-services
aws iam delete-role \
--role-name CrossAccount-ClaudePlatform-Prod \
--profile ai-services
aws iam delete-role-policy \
--role-name OIDC-ClaudePlatform-Prod \
--policy-name CPonAWS-OIDC-Inference-Prod \
--profile ai-services
aws iam delete-role \
--role-name OIDC-ClaudePlatform-Prod \
--profile ai-services
删除 OIDC Provider:
aws iam delete-open-id-connect-provider \
--open-id-connect-provider-arn arn:aws:iam::AI_SERVICES_ACCOUNT_ID:oidc-provider/YOUR_OIDC_ISSUER \
--profile ai-services
aws secretsmanager delete-secret \
--secret-id cponaws/dev-api-key \
--force-delete-without-recovery \
--region YOUR_REGION \
--profile ai-services
取消订阅 CPonAWS:导航至 AWS Marketplace,Your Subscriptions,取消 Claude Platform 订阅。
通过配置跨账户 SigV4、工作区范围的 API 密钥和 OIDC 联邦,你的 CPonAWS 部署支持 AWS 工作负载、开发者访问和具有工作区级隔离的外部环境。针对生产环境加固:
监控:为 aws-external-anthropic 服务配置 AWS CloudTrail 数据事件,以获取具有主体归属的逐调用审计能力。
成本分摊:为每个工作区添加标签(例如 team:payments、environment:prod),并在 Billing Console 的 Cost Allocation Tags 下激活这些标签。激活后(需要 24–48 小时),你可以按工作区筛选 AWS Cost Explorer,将 Claude 费用归因到特定项目、团队或环境。
要开始使用 Claude Platform on AWS,请访问 Claude Platform on AWS 服务页面,或直接前往 AWS Management Console。完整文档请参阅 Claude Platform on AWS User Guide 和 Anthropic 文档。