Рабочие нагрузки AWS могут аутентифицироваться в Claude API без статических ключей API (API key), обменивая подписанный AWS токен идентификации OIDC. Рекомендуемый путь вызывает API AWS STS GetWebIdentityToken, который работает везде, где у рабочей нагрузки есть учётные данные AWS: Lambda, EC2, ECS и EKS. Рабочие нагрузки EKS могут альтернативно использовать путь с проецируемым токеном Kubernetes, который требует меньше шагов настройки, но работает только внутри пода.
Это руководство показывает оба пути. Для базовых концепций (сервисные аккаунты, издатели федерации и правила федерации) см. Workload Identity Federation.
aws или AWS SDK, доступный в рабочей нагрузке.API AWS STS GetWebIdentityToken возвращает токен OIDC, подписанный AWS, который подтверждает идентичность IAM вызывающей стороны. Поскольку он использует окружающие учётные данные AWS рабочей нагрузки, одна и та же интеграция охватывает Lambda, EC2, ECS и EKS.
Включите исходящую федерацию веб-идентификации для аккаунта
Это флаг уровня аккаунта, по умолчанию выключен. В консоли AWS откройте IAM, выберите Account settings и включите Outbound web identity federation. Чтобы включить его программно:
python3 -c "import boto3; boto3.client('iam').enable_outbound_web_identity_federation()"Если это не включено, вызовы GetWebIdentityToken завершаются ошибкой OutboundWebIdentityFederationDisabledException.
Предоставьте роли IAM рабочей нагрузки разрешение на вызов API
Прикрепите эту политику к роли IAM, от имени которой работает ваша функция Lambda, экземпляр EC2 или задача ECS:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken"],
"Resource": "*"
}
]
}Найдите URL издателя STS вашего аккаунта
После включения исходящей федерации страница 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())"В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите плитку AWS. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Зарегистрируйте URL издателя STS для вашего аккаунта, который вы скопировали на предыдущем шаге. Он предоставляет публичную конечную точку JWKS, поэтому используйте режим обнаружения.
{
"name": "aws-sts",
"issuer_url": "https://<uuid>.tokens.sts.global.api.aws",
"jwks": { "type": "discovery" }
}Правило федерации: Сопоставьте аудиторию, которую вы передаёте в GetWebIdentityToken, и ARN роли IAM вызывающей роли в утверждении sub. Значение sub — это ARN роли IAM рабочей нагрузки, которая вызвала API, в форме 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 роли и расширяйте subject_prefix (например, до arn:aws:iam::123456789012:role/*) только если несколько ролей IAM должны сопоставляться с одним и тем же сервисным аккаунтом Anthropic.
Вызовите GetWebIdentityToken с https://api.anthropic.com в качестве аудитории, затем передайте результат в учётные данные федерации 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.
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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from AWS"}],
)
print(next(block.text for block in message.content if block.type == "text"))Изнутри рабочей нагрузки обменяйте токен, выданный STS, напрямую и изучите ответ:
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Успешный обмен возвращает access_token, начинающийся с sk-ant-oat01-, и значение expires_in в секундах. При 400 invalid_grant см. Устранение неполадок при неудачном обмене; наиболее распространённая причина со стороны AWS — несоответствие iss (URL издателя STS для аккаунта должен точно совпадать с зарегистрированным issuer_url).
Если ваша рабочая нагрузка выполняется в поде EKS, вы можете пропустить вызов STS и прочитать проецируемый Kubernetes токен сервисного аккаунта напрямую с диска. Kubernetes нативно проецирует OIDC-совместимый токен в под, и SDK может прочитать его из пути к файлу, поэтому вызываемый поставщик токенов не требуется. Этот путь требует на два шага настройки AWS меньше, чем путь STS, но работает только внутри пода; базовый механизм такой же, как в общей интеграции Kubernetes.
Этот путь дополнительно требует кластер EKS с включённым провайдером IAM OIDC и доступ kubectl к кластеру.
Найдите URL издателя OIDC вашего кластера
Каждый кластер EKS имеет уникального издателя OIDC. Получите его с помощью AWS 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 как издателя федерации в следующем разделе.
Создайте сервисный аккаунт и спроецируйте токен с аудиторией Anthropic
Вебхук идентификации подов EKS обнаруживает аннотацию 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-workerapiVersion: 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Обратите внимание на форму утверждений токена
Проецируемый токен — это JSON Web Token (JWT), подписанный издателем OIDC вашего кластера. Его утверждение 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. Отдельный токен, внедрённый IRSA по пути AWS_WEB_IDENTITY_TOKEN_FILE, содержит aud: sts.amazonaws.com и предназначен для вызовов API AWS, а не для этого обмена.
В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите плитку AWS. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Издатели EKS предоставляют публичную конечную точку JWKS, поэтому используйте режим обнаружения. URL издателя должен точно совпадать с утверждением iss токена. Регистрируйте одного издателя на кластер.
{
"name": "prod-eks-uswest2",
"issuer_url": "https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB...",
"jwks": { "type": "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
}Будьте настолько конкретны, насколько позволяет рабочая нагрузка. Ослабляйте subject_prefix до system:serviceaccount:inference:* (завершающий * делает его сопоставлением по префиксу) только если каждый сервисный аккаунт в пространстве имён должен сопоставляться с одним и тем же сервисным аккаунтом Anthropic.
Внутри пода проецируемый токен находится по пути /var/run/secrets/anthropic.com/token (предоставляется как ANTHROPIC_IDENTITY_TOKEN_FILE в спецификации Pod). Передайте этот файл в учётные данные федерации SDK, и SDK выполнит обмен и обновление.
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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from EKS"}],
)
print(next(block.text for block in message.content if block.type == "text"))Спецификация Pod уже устанавливает ANTHROPIC_IDENTITY_TOKEN_FILE, ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID и ANTHROPIC_WORKSPACE_ID, поэтому вы можете создать клиент без аргументов, и SDK автоматически прочитает переменные окружения федерации.
Изнутри пода обменяйте проецируемый токен напрямую и изучите ответ:
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Успешный обмен возвращает access_token, начинающийся с sk-ant-oat01-, и значение 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 правила до самой узкой области, которая подходит для вашего случая использования:
subject_prefix: "arn:aws:iam::<account>:role/<role-name>" без завершающего *, чтобы другие роли в аккаунте не соответствовали.aws_account утверждения https://sts.amazonaws.com/ токена с помощью карты claims или CEL-условия condition в качестве проверки глубокой защиты от неправильно настроенного префикса.system:serviceaccount:<namespace>:<name> без * после префикса system:serviceaccount:.Was this page helpful?