• 消息
  • 托管智能体
  • 管理
Search...
⌘K
组织
管理 API工作区
身份验证
概览工作负载身份联合WIF 参考
AWSGoogle CloudMicrosoft AzureGitHub ActionsKubernetesSPIFFEOkta
监控
用量与成本 API速率限制 APIClaude Code 分析 API
数据与合规
数据驻留API 与数据保留
合规 API
概览获取访问权限活动动态聊天、文件和项目组织、用户、角色和群组设计您的集成错误常见问题
Log in
AWS
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
管理/身份提供商

在 AWS 中使用 WIF

通过 Workload Identity Federation 和 STS 签发的身份令牌,将 Lambda、EC2、ECS 或 EKS 上的 AWS 工作负载认证到 Claude API。

AWS 工作负载可以通过交换由 AWS 签名的 OIDC 身份令牌来向 Claude API 进行身份验证,而无需使用静态 API 密钥。推荐的方式是调用 AWS STS GetWebIdentityToken API,该方式适用于任何具有 AWS 凭证的工作负载环境:Lambda、EC2、ECS 和 EKS。EKS 工作负载也可以选择使用 Kubernetes 投影令牌方式,该方式配置步骤更少,但仅适用于 Pod 内部。

本指南介绍这两种方式。有关底层概念(服务账户、联合身份签发者和联合身份规则),请参阅 Workload Identity Federation。

前提条件

  • 熟悉 WIF 概念:服务账户、联合身份签发者和联合身份规则。
  • 一个附加了 IAM 角色的 AWS 工作负载(EKS Pod、ECS 任务、Lambda 函数或 EC2 实例)。
  • 工作负载中可用的 aws CLI 或 AWS SDK。
  • 在 Claude Console 中为您的 Anthropic 组织创建服务账户、联合身份签发者和联合身份规则的权限。

使用 STS Web 身份令牌(推荐)

AWS STS GetWebIdentityToken API 返回一个由 AWS 签名的 OIDC 令牌,用于声明调用方的 IAM 身份。由于它使用工作负载的环境 AWS 凭证,因此同一集成方式可覆盖 Lambda、EC2、ECS 和 EKS。

配置 AWS

  1. 1

    为账户启用出站 Web 身份联合

    这是一个账户级别的标志,默认关闭。在 AWS 控制台中,打开 IAM,选择 Account settings(账户设置),然后启用 Outbound web identity federation(出站 Web 身份联合)。如需以编程方式启用:

    python3 -c "import boto3; boto3.client('iam').enable_outbound_web_identity_federation()"

    如果未启用此项,调用 GetWebIdentityToken 将失败并返回 OutboundWebIdentityFederationDisabledException。

  2. 2

    授予工作负载的 IAM 角色调用该 API 的权限

    将以下策略附加到您的 Lambda 函数、EC2 实例或 ECS 任务所使用的 IAM 角色:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["sts:GetWebIdentityToken"],
          "Resource": "*"
        }
      ]
    }
  3. 3

    查找您账户的 STS 签发者 URL

    启用出站联合后,IAM > Account settings(账户设置)页面会显示一个 Get Token Issuer URL 字段,其值的格式为 https://<uuid>.tokens.sts.global.api.aws。此 URL 对您的 AWS 账户是唯一的;请复制它以供下一步使用。如需以编程方式获取:

    python3 -c "import boto3; print(boto3.client('iam').get_outbound_web_identity_federation_info())"

配置 Anthropic

按照设置演练在 Claude Console 中注册联合身份签发者、创建 Anthropic 服务账户并创建联合身份规则。请使用以下 STS 特定的值。

联合身份签发者: 注册您在上一步中复制的账户专属 STS 签发者 URL。它公开了一个公共 JWKS 端点,因此请使用发现模式。

{
  "name": "aws-sts",
  "issuer_url": "https://<uuid>.tokens.sts.global.api.aws",
  "jwks_source": "discovery"
}

联合身份规则: 匹配您传递给 GetWebIdentityToken 的受众(audience)以及 sub 声明中调用角色的 IAM 角色 ARN。sub 值是调用该 API 的工作负载的 IAM 角色 ARN,格式为 arn:aws:iam::<account>:role/<role-name>。该令牌还携带一个 https://sts.amazonaws.com/ 声明,其中包含 aws_account、org_id、principal_id 以及您传递的任何 request_tags;您可以通过规则的 claims 映射或 CEL condition 对这些字段进行匹配,以实现更精细的控制。

{
  "name": "prod-inference",
  "issuer_id": "fdis_...",
  "match": {
    "subject_prefix": "arn:aws:iam::123456789012:role/inference-worker",
    "audience": "https://api.anthropic.com"
  },
  "target": { "type": "service_account", "service_account_id": "svac_..." },
  "workspace_id": "wrkspc_...",
  "oauth_scope": "workspace:developer",
  "token_lifetime_seconds": 600
}

请尽可能精确地限定工作负载范围。匹配确切的角色 ARN,仅当多个 IAM 角色应映射到同一个 Anthropic 服务账户时,才放宽 subject_prefix(例如,放宽为 arn:aws:iam::123456789012:role/*)。

获取并使用令牌

以 https://api.anthropic.com 作为受众调用 GetWebIdentityToken,然后将结果传递给 SDK 的联合身份凭证。令牌提供程序是一个可调用对象,因此 SDK 会在每次刷新时重新调用 STS。

GetWebIdentityToken 仅在区域性 STS 端点上可用。如果您收到 'STS' object has no attribute 'get_web_identity_token' 或类似错误,请将您的 STS 客户端固定到某个区域(例如 boto3.client("sts", region_name="us-east-1")),并确保您的 AWS SDK 版本足够新以包含该 API。

验证设置

在工作负载内部,直接交换 STS 签发的令牌并检查响应:

cURL
JWT=$(aws sts get-web-identity-token \
  --region us-east-1 \
  --audience "https://api.anthropic.com" \
  --signing-algorithm RS256 \
  --duration-seconds 900 \
  --query WebIdentityToken --output text)

curl -sS https://api.anthropic.com/v1/oauth/token \
  -H "content-type: application/json" \
  -d "{
    \"grant_type\": \"urn:ietf:params:oauth:grant-type:jwt-bearer\",
    \"assertion\": \"$JWT\",
    \"federation_rule_id\": \"fdrl_...\",
    \"organization_id\": \"00000000-0000-0000-0000-000000000000\",
    \"service_account_id\": \"svac_...\",
    \"workspace_id\": \"wrkspc_...\"
  }" | jq

成功的交换会返回一个以 sk-ant-oat01- 开头的 access_token 以及一个以秒为单位的 expires_in 值。如果收到 400 invalid_grant,请参阅排查交换失败问题;AWS 端最常见的原因是 iss 不匹配(账户专属的 STS 签发者 URL 必须与已注册的 issuer_url 完全一致)。

使用 EKS 投影服务账户令牌

如果您的工作负载在 EKS Pod 中运行,您可以跳过 STS 调用,直接从磁盘读取 Kubernetes 投影的服务账户令牌。Kubernetes 会原生地将一个兼容 OIDC 的令牌投影到 Pod 中,SDK 可以从文件路径读取它,因此不需要令牌提供程序可调用对象。与 STS 方式相比,此方式少了两个 AWS 配置步骤,但仅适用于 Pod 内部;其底层机制与通用 Kubernetes 集成相同。

此方式还需要一个已启用 IAM OIDC 提供程序的 EKS 集群以及对该集群的 kubectl 访问权限。

配置您的 EKS 集群

配置 Anthropic

按照设置演练在 Claude Console 中注册联合身份签发者、创建 Anthropic 服务账户并创建联合身份规则。请使用以下 EKS 特定的值。

联合身份签发者: EKS 签发者公开了一个公共 JWKS 端点,因此请使用发现模式。签发者 URL 必须与令牌的 iss 声明完全匹配。每个集群注册一个签发者。

{
  "name": "prod-eks-uswest2",
  "issuer_url": "https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB...",
  "jwks_source": "discovery"
}

联合身份规则: 匹配 Kubernetes 的 sub 声明和 Anthropic 受众 https://api.anthropic.com。(请投影一个带有该受众的专用服务账户令牌;不要重用 IRSA 默认的 sts.amazonaws.com 令牌。)

{
  "name": "prod-inference",
  "issuer_id": "fdis_...",
  "match": {
    "subject_prefix": "system:serviceaccount:inference:inference-worker",
    "audience": "https://api.anthropic.com"
  },
  "target": { "type": "service_account", "service_account_id": "svac_..." },
  "workspace_id": "wrkspc_...",
  "oauth_scope": "workspace:developer",
  "token_lifetime_seconds": 600
}

请尽可能精确地限定工作负载范围。仅当命名空间中的每个服务账户都应映射到同一个 Anthropic 服务账户时,才将 subject_prefix 放宽为 system:serviceaccount:inference:*(末尾的 * 使其成为前缀匹配)。

获取并使用令牌

在 Pod 内部,投影的令牌位于 /var/run/secrets/anthropic.com/token(在 Pod 规范中公开为 ANTHROPIC_IDENTITY_TOKEN_FILE)。将该文件传递给 SDK 的联合身份凭证,SDK 会处理交换和刷新。

Pod 规范已经设置了 ANTHROPIC_IDENTITY_TOKEN_FILE、ANTHROPIC_FEDERATION_RULE_ID、ANTHROPIC_ORGANIZATION_ID、ANTHROPIC_SERVICE_ACCOUNT_ID 和 ANTHROPIC_WORKSPACE_ID,因此您可以不带任何参数构造客户端,SDK 会自动读取联合身份环境变量。

验证设置

在 Pod 内部,直接交换投影的令牌并检查响应:

cURL
JWT=$(cat "$ANTHROPIC_IDENTITY_TOKEN_FILE")

curl -sS https://api.anthropic.com/v1/oauth/token \
  -H "content-type: application/json" \
  -d "{
    \"grant_type\": \"urn:ietf:params:oauth:grant-type:jwt-bearer\",
    \"assertion\": \"$JWT\",
    \"federation_rule_id\": \"$ANTHROPIC_FEDERATION_RULE_ID\",
    \"organization_id\": \"$ANTHROPIC_ORGANIZATION_ID\",
    \"service_account_id\": \"$ANTHROPIC_SERVICE_ACCOUNT_ID\",
    \"workspace_id\": \"$ANTHROPIC_WORKSPACE_ID\"
  }" | jq

成功的交换会返回一个以 sk-ant-oat01- 开头的 access_token 以及一个以秒为单位的 expires_in 值。如果收到 400 invalid_grant,请参阅排查交换失败问题;EKS 端最常见的原因是投影令牌的 aud 与规则不匹配(请投影一个带有 audience: https://api.anthropic.com 的令牌,而不是 IRSA 默认的 sts.amazonaws.com)。

限定规则范围

subject_prefix 为 arn:aws:iam::123456789012:role/* 会匹配该账户中的每个 IAM 角色。任何能够代入任意匹配角色的主体都可以获取联合的 Anthropic 令牌。

将规则的 match 块锁定到适合您用例的最窄范围:

  • 固定完整的角色 ARN: 使用 subject_prefix: "arn:aws:iam::<account>:role/<role-name>",不带末尾的 *,以确保账户中的其他角色不会匹配。
  • 固定账户 ID: 通过 claims 映射或 CEL condition 匹配令牌的 https://sts.amazonaws.com/ 声明中的 aws_account 字段,作为针对前缀配置错误的纵深防御检查。
  • 在 EKS 上固定命名空间和服务账户: 使用确切的 system:serviceaccount:<namespace>:<name> 值,在 system:serviceaccount: 前缀后不带 *。
  • 为每个环境使用单独的规则: 为生产、预发布和开发工作负载创建不同的规则,而不是放宽一个前缀来覆盖所有环境。

后续步骤

  • 查阅 WIF 参考,了解完整的凭证优先级、配置文件配置和规则匹配参考。
  • 对于不在 EKS 上的自管理 Kubernetes 集群,请参阅在 Kubernetes 中使用 WIF。

Was this page helpful?

  • 前提条件
  • 使用 STS Web 身份令牌(推荐)
  • 配置 AWS
  • 配置 Anthropic
  • 获取并使用令牌
  • 验证设置
  • 使用 EKS 投影服务账户令牌
  • 配置您的 EKS 集群
  • 配置 Anthropic
  • 获取并使用令牌
  • 验证设置
  • 限定规则范围
  • 后续步骤
import os

import anthropic
import boto3
from anthropic import WorkloadIdentityCredentials


def get_sts_web_identity_token() -> str:
    sts = boto3.client("sts", region_name="us-east-1")
    resp = sts.get_web_identity_token(
        Audience=["https://api.anthropic.com"],
        SigningAlgorithm="RS256",
        DurationSeconds=900,
    )
    return resp["WebIdentityToken"]


client = anthropic.Anthropic(
    credentials=WorkloadIdentityCredentials(
        identity_token_provider=get_sts_web_identity_token,
        federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
        organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
        service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
        workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
    ),
)

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello from AWS"}],
)
print(message.content[0].text)
  1. 1

    查找您集群的 OIDC 签发者 URL

    每个 EKS 集群都有一个唯一的 OIDC 签发者。使用 AWS CLI 获取它:

    CLI
    aws eks describe-cluster \
      --name <cluster-name> \
      --query "cluster.identity.oidc.issuer" \
      --output text

    输出类似于 https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB...。您将在下一节中将此 URL 注册为联合身份签发者。

  2. 2

    创建服务账户并投影一个 Anthropic 受众的令牌

    EKS Pod 身份 Webhook 会检测 eks.amazonaws.com/role-arn 注解,并自动投影一个带有 aud: sts.amazonaws.com 的令牌,将其路径公开为 AWS_WEB_IDENTITY_TOKEN_FILE。该令牌用于 AWS 角色代入。对于 Anthropic 交换,请投影第二个带有 audience: https://api.anthropic.com 的令牌,并将其挂载到专用路径。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: inference-worker
      namespace: inference
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/inference-worker
    apiVersion: v1
    kind: Pod
    metadata:
      name: inference-worker
      namespace: inference
    spec:
      serviceAccountName: inference-worker
      volumes:
        - name: anthropic-token
          projected:
            sources:
              - serviceAccountToken:
                  audience: https://api.anthropic.com
                  expirationSeconds: 3600
                  path: token
      containers:
        - name: app
          image: your-registry/inference-worker:latest
          env:
            - name: ANTHROPIC_IDENTITY_TOKEN_FILE
              value: /var/run/secrets/anthropic.com/token
            - name: ANTHROPIC_FEDERATION_RULE_ID
              value: fdrl_...
            - name: ANTHROPIC_ORGANIZATION_ID
              value: 00000000-0000-0000-0000-000000000000
            - name: ANTHROPIC_SERVICE_ACCOUNT_ID
              value: svac_...
            - name: ANTHROPIC_WORKSPACE_ID  # required when the rule covers multiple workspaces
              value: wrkspc_...
          volumeMounts:
            - name: anthropic-token
              mountPath: /var/run/secrets/anthropic.com
              readOnly: true
  3. 3

    了解令牌的声明结构

    投影的令牌是一个由您集群的 OIDC 签发者签名的 "JSON Web Token"(JSON Web 令牌),即 JWT。其 sub 声明遵循 Kubernetes 约定 system:serviceaccount:<namespace>:<service-account-name>:

    {
      "iss": "https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB...",
      "sub": "system:serviceaccount:inference:inference-worker",
      "aud": ["https://api.anthropic.com"],
      "kubernetes.io": {
        "namespace": "inference",
        "serviceaccount": { "name": "inference-worker", "uid": "..." }
      },
      "exp": 1775527120,
      "iat": 1775523520
    }

    serviceAccountToken 投影将 aud 设置为 https://api.anthropic.com。位于 AWS_WEB_IDENTITY_TOKEN_FILE 的单独 IRSA 注入令牌携带 aud: sts.amazonaws.com,用于 AWS API 调用,而非此交换。

import os

import anthropic
from anthropic import IdentityTokenFile, WorkloadIdentityCredentials

client = anthropic.Anthropic(
    credentials=WorkloadIdentityCredentials(
        identity_token_provider=IdentityTokenFile(
            os.environ["ANTHROPIC_IDENTITY_TOKEN_FILE"]
        ),
        federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
        organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
        service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
        workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
    ),
)

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello from EKS"}],
)
print(message.content[0].text)