Использование WIF с AWS
Аутентификация рабочих нагрузок AWS на Lambda, EC2, ECS или EKS в Claude API с помощью Workload Identity Federation и токенов идентификации, выданных STS.
Рабочие нагрузки AWS могут аутентифицироваться в Claude API без статических ключей API путём обмена подписанного AWS токена идентификации OIDC. Рекомендуемый путь вызывает API AWS STS GetWebIdentityToken, который работает везде, где у рабочей нагрузки есть учётные данные AWS: Lambda, EC2, ECS и EKS. Рабочие нагрузки EKS могут в качестве альтернативы использовать путь проецируемых токенов Kubernetes, который имеет меньше шагов настройки, но работает только внутри пода.
Это руководство показывает оба пути. Для понимания базовых концепций (сервисные учётные записи, эмитенты федерации и правила федерации) см. Workload Identity Federation.
Предварительные требования
- Знакомство с концепциями WIF: сервисные учётные записи, эмитенты федерации и правила федерации.
- Рабочая нагрузка AWS (под EKS, задача ECS, функция Lambda или инстанс EC2) с прикреплённой ролью IAM.
- CLI
awsили AWS SDK, доступный в рабочей нагрузке. - Разрешение на создание сервисных учётных записей, эмитентов федерации и правил федерации в Claude Console для вашей организации Anthropic.
Использование веб-токенов идентификации STS (рекомендуется)
API AWS STS GetWebIdentityToken возвращает токен OIDC, подписанный AWS, который подтверждает идентификацию IAM вызывающей стороны. Поскольку он использует окружающие учётные данные AWS рабочей нагрузки, одна и та же интеграция охватывает Lambda, EC2, ECS и EKS.
Настройка AWS
Включите исходящую веб-федерацию идентификации для аккаунта
Это флаг уровня аккаунта, по умолчанию отключённый. В консоли 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())"
Настройка Anthropic
В 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 при каждом обновлении.
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 в секундах. Если обмен завершается непрозрачным ответом 401 authentication_error (сообщение Authentication failed), проверьте страницу истории аутентификации на предмет причины отказа и см. Устранение неполадок неудачного обмена; наиболее распространённая причина на стороне AWS — несоответствие iss (URL эмитента STS для конкретного аккаунта должен точно совпадать с зарегистрированным issuer_url).
Использование проецируемых токенов сервисной учётной записи EKS
Если ваша рабочая нагрузка выполняется в поде EKS, вы можете пропустить вызов STS и прочитать проецируемый Kubernetes токен сервисной учётной записи напрямую с диска. Kubernetes нативно проецирует OIDC-совместимый токен в под, и SDK может прочитать его из пути к файлу, поэтому вызываемый поставщик токенов не требуется. Этот путь имеет на два шага настройки AWS меньше, чем путь STS, но работает только внутри пода; базовый механизм такой же, как у общей интеграции Kubernetes.
Этот путь дополнительно требует кластер EKS с включённым поставщиком IAM OIDC и доступом kubectl к кластеру.
Настройка вашего кластера EKS
Найдите URL эмитента OIDC вашего кластера
Каждый кластер EKS имеет уникальный эмитент OIDC. Получите его с помощью AWS CLI:
CLIaws 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следует соглашению Kubernetessystem: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, а не для этого обмена.
Настройка Anthropic
В 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 в спецификации пода). Передайте этот файл в учётные данные федерации 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"))Проверка настройки
Изнутри пода обменяйте проецируемый токен напрямую и проверьте ответ:
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 в секундах. Если обмен завершается непрозрачным ответом 401 authentication_error (сообщение Authentication failed), проверьте страницу истории аутентификации на предмет причины отказа и см. Устранение неполадок неудачного обмена; наиболее распространённая причина на стороне EKS — несоответствие aud проецируемого токена правилу (спроецируйте токен с audience: https://api.anthropic.com, а не с IRSA по умолчанию sts.amazonaws.com).
Ограничение области действия вашего правила
Заблокируйте блок match правила до самой узкой области, которая подходит для вашего сценария использования:
- Привяжите полный ARN роли: Используйте
subject_prefix: "arn:aws:iam::<account>:role/<role-name>"без завершающего*, чтобы другие роли в аккаунте не совпадали. - Привяжите ID аккаунта: Сопоставьте поле
aws_accountутвержденияhttps://sts.amazonaws.com/токена с картойclaimsили CELconditionв качестве проверки глубокой защиты от неправильно настроенного префикса. - Привяжите пространство имён и сервисную учётную запись на EKS: Используйте точное значение
system:serviceaccount:<namespace>:<name>без*после префиксаsystem:serviceaccount:. - Используйте отдельное правило для каждой среды: Создавайте отдельные правила для рабочих нагрузок production, staging и development, а не расширяйте один префикс, чтобы охватить их все.
Следующие шаги
- Ознакомьтесь со справочником WIF для полного приоритета учётных данных, настройки профиля и справочника по сопоставлению правил.
- Для самоуправляемых кластеров Kubernetes, которые не находятся на EKS, см. Использование WIF с Kubernetes.
Was this page helpful?