Workload AWS dapat melakukan autentikasi ke Claude API tanpa kunci API statis dengan menukarkan token identitas OIDC yang ditandatangani AWS. Jalur yang direkomendasikan adalah memanggil API AWS STS GetWebIdentityToken, yang berfungsi di mana pun workload memiliki kredensial AWS: Lambda, EC2, ECS, dan EKS. Workload EKS dapat menggunakan alternatif jalur projected token Kubernetes, yang memiliki lebih sedikit langkah konfigurasi tetapi hanya berfungsi di dalam pod.
Panduan ini menunjukkan kedua jalur tersebut. Untuk konsep yang mendasarinya (service account, federation issuer, dan federation rule), lihat Workload Identity Federation.
aws atau AWS SDK yang tersedia di workload.API AWS STS GetWebIdentityToken mengembalikan token OIDC yang ditandatangani oleh AWS yang menyatakan identitas IAM pemanggil. Karena menggunakan kredensial AWS ambien milik workload, integrasi yang sama mencakup Lambda, EC2, ECS, dan EKS.
Aktifkan outbound web identity federation untuk akun
Ini adalah flag tingkat akun, yang secara default nonaktif. Di konsol AWS, buka IAM, pilih Account settings, dan aktifkan Outbound web identity federation. Untuk mengaktifkannya secara terprogram:
python3 -c "import boto3; boto3.client('iam').enable_outbound_web_identity_federation()"Jika ini tidak diaktifkan, panggilan ke GetWebIdentityToken akan gagal dengan OutboundWebIdentityFederationDisabledException.
Berikan izin kepada IAM role workload untuk memanggil API
Lampirkan policy ini ke IAM role yang digunakan oleh fungsi Lambda, instance EC2, atau task ECS Anda:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken"],
"Resource": "*"
}
]
}Temukan URL issuer STS akun Anda
Setelah mengaktifkan outbound federation, halaman IAM > Account settings menampilkan kolom Get Token Issuer URL dengan nilai dalam bentuk https://<uuid>.tokens.sts.global.api.aws. URL ini unik untuk akun AWS Anda; salin untuk langkah berikutnya. Untuk mengambilnya secara terprogram:
python3 -c "import boto3; print(boto3.client('iam').get_outbound_web_identity_federation_info())"Di Claude Console, buka Settings → Workload identity, klik Connect workload, dan pilih tile AWS. Wizard akan memandu Anda mendaftarkan issuer, membuat service account, dan membuat federation rule.
Wizard ini membuat sumber daya tersebut untuk Anda. Gunakan nilai-nilai berikut baik saat Anda memasukkannya di wizard maupun saat mengirimkannya ke Admin API:
Federation issuer: Daftarkan URL issuer STS per-akun yang Anda salin pada langkah sebelumnya. URL tersebut mengekspos endpoint JWKS publik, jadi gunakan mode discovery.
{
"name": "aws-sts",
"issuer_url": "https://<uuid>.tokens.sts.global.api.aws",
"jwks": { "type": "discovery" }
}Federation rule: Cocokkan audience yang Anda berikan ke GetWebIdentityToken dan ARN IAM role pemanggil di klaim sub. Nilai sub adalah ARN IAM role dari workload yang memanggil API, dalam bentuk arn:aws:iam::<account>:role/<role-name>. Token juga membawa klaim https://sts.amazonaws.com/ dengan aws_account, org_id, principal_id, dan request_tags apa pun yang Anda berikan; Anda dapat mencocokkannya dengan map claims pada rule atau condition CEL untuk kontrol yang lebih detail.
{
"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
}Buat sespesifik yang diizinkan oleh workload. Cocokkan ARN role yang tepat, dan hanya perluas subject_prefix (misalnya, menjadi arn:aws:iam::123456789012:role/*) jika beberapa IAM role harus dipetakan ke service account Anthropic yang sama.
Panggil GetWebIdentityToken dengan https://api.anthropic.com sebagai audience, lalu berikan hasilnya ke kredensial federasi SDK. Token provider adalah sebuah callable, sehingga SDK memanggil ulang STS pada setiap refresh.
GetWebIdentityToken hanya tersedia pada endpoint STS regional. Jika Anda menerima 'STS' object has no attribute 'get_web_identity_token' atau error serupa, tetapkan klien STS Anda ke sebuah region (misalnya, boto3.client("sts", region_name="us-east-1")) dan pastikan AWS SDK Anda cukup baru untuk menyertakan API tersebut.
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)Dari dalam workload, tukarkan token yang diterbitkan STS secara langsung dan periksa responsnya:
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_...\"
}" | jqPertukaran yang berhasil mengembalikan access_token yang diawali dengan sk-ant-oat01- dan nilai expires_in dalam detik. Jika terjadi 400 invalid_grant, lihat Memecahkan masalah pertukaran yang gagal; penyebab paling umum di sisi AWS adalah ketidakcocokan iss (URL issuer STS per-akun harus cocok persis dengan issuer_url yang terdaftar).
Jika workload Anda berjalan di pod EKS, Anda dapat melewati panggilan STS dan membaca projected service-account token Kubernetes langsung dari disk. Kubernetes secara native memproyeksikan token yang kompatibel dengan OIDC ke dalam pod, dan SDK dapat membacanya dari path file, sehingga tidak diperlukan callable token-provider. Jalur ini memiliki dua langkah konfigurasi AWS lebih sedikit dibandingkan jalur STS tetapi hanya berfungsi di dalam pod; mekanisme yang mendasarinya sama dengan integrasi Kubernetes generik.
Jalur ini juga memerlukan cluster EKS dengan IAM OIDC provider yang diaktifkan dan akses kubectl ke cluster.
Temukan URL issuer OIDC cluster Anda
Setiap cluster EKS memiliki issuer OIDC yang unik. Ambil dengan AWS CLI:
aws eks describe-cluster \
--name <cluster-name> \
--query "cluster.identity.oidc.issuer" \
--output textOutput-nya terlihat seperti https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB.... Anda akan mendaftarkan URL ini sebagai federation issuer di bagian berikutnya.
Buat service account dan proyeksikan token dengan audience Anthropic
Webhook identitas pod EKS mendeteksi anotasi eks.amazonaws.com/role-arn dan secara otomatis memproyeksikan token dengan aud: sts.amazonaws.com, mengekspos path-nya sebagai AWS_WEB_IDENTITY_TOKEN_FILE. Token tersebut untuk asumsi role AWS. Untuk pertukaran Anthropic, proyeksikan token kedua dengan audience: https://api.anthropic.com dan mount di path khusus.
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: truePerhatikan bentuk klaim token
Projected token adalah "JSON Web Token", atau JWT, yang ditandatangani oleh issuer OIDC cluster Anda. Klaim sub-nya mengikuti konvensi 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
}Proyeksi serviceAccountToken menetapkan aud ke https://api.anthropic.com. Token terpisah yang diinjeksi IRSA di AWS_WEB_IDENTITY_TOKEN_FILE membawa aud: sts.amazonaws.com dan ditujukan untuk panggilan API AWS, bukan pertukaran ini.
Di Claude Console, buka Settings → Workload identity, klik Connect workload, dan pilih tile AWS. Wizard akan memandu Anda mendaftarkan issuer, membuat service account, dan membuat federation rule.
Wizard ini membuat sumber daya tersebut untuk Anda. Gunakan nilai-nilai berikut baik saat Anda memasukkannya di wizard maupun saat mengirimkannya ke Admin API:
Federation issuer: Issuer EKS mengekspos endpoint JWKS publik, jadi gunakan mode discovery. URL issuer harus cocok persis dengan klaim iss token. Daftarkan satu issuer per cluster.
{
"name": "prod-eks-uswest2",
"issuer_url": "https://oidc.eks.us-west-2.amazonaws.com/id/6FA42E7BFDE8549CB...",
"jwks": { "type": "discovery" }
}Federation rule: Cocokkan klaim sub Kubernetes dan audience Anthropic https://api.anthropic.com. (Proyeksikan service-account token khusus dengan audience tersebut; jangan gunakan kembali token default 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
}Buat sespesifik yang diizinkan oleh workload. Longgarkan subject_prefix menjadi system:serviceaccount:inference:* (tanda * di akhir menjadikannya pencocokan prefix) hanya jika setiap service account di namespace tersebut harus dipetakan ke service account Anthropic yang sama.
Di dalam pod, projected token berada di /var/run/secrets/anthropic.com/token (diekspos sebagai ANTHROPIC_IDENTITY_TOKEN_FILE di spesifikasi Pod). Berikan file tersebut ke kredensial federasi SDK dan SDK akan menangani pertukaran dan refresh.
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)Spesifikasi Pod sudah menetapkan ANTHROPIC_IDENTITY_TOKEN_FILE, ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, dan ANTHROPIC_WORKSPACE_ID, sehingga Anda dapat membuat klien tanpa argumen dan SDK akan membaca variabel lingkungan federasi secara otomatis.
Dari dalam pod, tukarkan projected token secara langsung dan periksa responsnya:
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\"
}" | jqPertukaran yang berhasil mengembalikan access_token yang diawali dengan sk-ant-oat01- dan nilai expires_in dalam detik. Jika terjadi 400 invalid_grant, lihat Memecahkan masalah pertukaran yang gagal; penyebab paling umum di sisi EKS adalah aud pada projected token tidak cocok dengan rule (proyeksikan token dengan audience: https://api.anthropic.com, bukan default IRSA sts.amazonaws.com).
subject_prefix dengan nilai arn:aws:iam::123456789012:role/* cocok dengan setiap IAM role di akun tersebut. Principal mana pun yang dapat mengasumsikan role yang cocok dapat memperoleh token Anthropic terfederasi.
Kunci blok match pada rule ke cakupan tersempit yang sesuai dengan kasus penggunaan Anda:
subject_prefix: "arn:aws:iam::<account>:role/<role-name>" tanpa * di akhir sehingga role lain di akun tidak cocok.aws_account dari klaim https://sts.amazonaws.com/ pada token dengan map claims atau condition CEL sebagai pemeriksaan pertahanan berlapis terhadap prefix yang salah konfigurasi.system:serviceaccount:<namespace>:<name> yang tepat tanpa * setelah prefix system:serviceaccount:.Was this page helpful?