Claude Platform Docs
АдминистрированиеПоставщики удостоверений

Использование 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.

API AWS STS GetWebIdentityToken возвращает токен OIDC, подписанный AWS, который подтверждает идентификацию IAM вызывающей стороны. Поскольку он использует окружающие учётные данные AWS рабочей нагрузки, одна и та же интеграция охватывает Lambda, EC2, ECS и EKS.

Настройка AWS

  1. Включите исходящую веб-федерацию идентификации для аккаунта

    Это флаг уровня аккаунта, по умолчанию отключённый. В консоли AWS откройте IAM, выберите Account settings и включите Outbound web identity federation. Чтобы включить его программно:

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

    Если это не включено, вызовы GetWebIdentityToken завершаются с ошибкой OutboundWebIdentityFederationDisabledException.

  2. Предоставьте роли IAM рабочей нагрузки разрешение на вызов API

    Прикрепите эту политику к роли IAM, от имени которой выполняется ваша функция Lambda, инстанс EC2 или задача ECS:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["sts:GetWebIdentityToken"],
          "Resource": "*"
        }
      ]
    }
  3. Найдите 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, напрямую и проверьте ответ:

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

Успешный обмен возвращает 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

  1. Найдите URL эмитента OIDC вашего кластера

    Каждый кластер 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. Создайте сервисную учётную запись и спроецируйте токен с аудиторией 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-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. Обратите внимание на форму утверждений токена

    Проецируемый токен — это 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, а не для этого обмена.

Настройка 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"))

Проверка настройки

Изнутри пода обменяйте проецируемый токен напрямую и проверьте ответ:

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

Успешный обмен возвращает 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 или CEL condition в качестве проверки глубокой защиты от неправильно настроенного префикса.
  • Привяжите пространство имён и сервисную учётную запись на EKS: Используйте точное значение system:serviceaccount:<namespace>:<name> без * после префикса system:serviceaccount:.
  • Используйте отдельное правило для каждой среды: Создавайте отдельные правила для рабочих нагрузок production, staging и development, а не расширяйте один префикс, чтобы охватить их все.

Следующие шаги

  • Ознакомьтесь со справочником WIF для полного приоритета учётных данных, настройки профиля и справочника по сопоставлению правил.
  • Для самоуправляемых кластеров Kubernetes, которые не находятся на EKS, см. Использование WIF с Kubernetes.

Was this page helpful?