Skip to main content
Questa pagina illustra un modo per eseguire il gateway delle app Claude su AWS. La configurazione è un esempio funzionante per infrastrutture gestite dal cliente piuttosto che una distribuzione di produzione supportata; utilizzatela per vedere come i componenti si incastrano insieme prima di adattarla al vostro ambiente. Per i requisiti indipendenti dalla piattaforma, consultate la guida alla distribuzione.
Questo esempio esegue il provisioning del gateway delle app Claude su AWS con Amazon Bedrock come upstream del modello, utilizzando Amazon ECS su AWS Fargate o Amazon EKS per il calcolo. Okta è il provider di identità (IdP) di esempio, ma qualsiasi IdP conforme a OpenID Connect (OIDC) funziona; consultate Configurazione del provider di identità per i dettagli specifici di ogni IdP.
Bedrock non è l’unico upstream Claude su AWS. Il gateway supporta anche Claude Platform su AWS, l’API Claude gestita da Anthropic con autenticazione AWS e fatturazione AWS Marketplace, al posto di Bedrock o insieme ad esso. La sua voce upstream, le credenziali e i permessi IAM differiscono da quelli specifici di Bedrock in questa pagina; il riferimento upstream Claude Platform su AWS copre cosa cambia, e il resto di questa pagina si applica invariato.

Architettura

Diagramma del gateway delle app Claude su AWS: i client Claude Code si connettono tramite HTTPS a un Application Load Balancer interno che sta davanti al gateway (ECS Fargate o EKS), che viene eseguito in subnet private insieme a un'istanza Amazon RDS per PostgreSQL per lo stato della sessione. Il gateway accede gli utenti tramite OIDC rispetto all'IdP aziendale, legge i segreti da AWS Secrets Manager, inoltra le richieste del modello ad Amazon Bedrock utilizzando il suo ruolo IAM e estrae la sua immagine da Amazon ECR al momento della distribuzione.

L'architettura di esempio, con Amazon Bedrock come upstream del modello. Un upstream Claude Platform su AWS occupa la stessa posizione.

Il gateway viene eseguito come endpoint HTTPS privato sulla vostra rete a cui gli sviluppatori accedono tramite il vostro IdP. Le loro sessioni Claude Code raggiungono i modelli Claude su Amazon Bedrock attraverso il ruolo IAM del gateway, quindi nessuna credenziale del modello finisce sulle macchine degli sviluppatori. La configurazione di riferimento esegue il provisioning di:
  • Servizio Amazon ECS su AWS Fargate o Amazon EKS Deployment che esegue il contenitore del gateway
  • Repository Amazon ECR per l’immagine del gateway
  • Istanza Amazon RDS per PostgreSQL in subnet private, non accessibile pubblicamente, per lo store del gateway
  • Segreti AWS Secrets Manager per la chiave di firma JWT, il segreto del client OIDC e l’URL di Postgres
  • Ruolo IAM con bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream e bedrock:CountTokens, allegato come ruolo di attività ECS o associato tramite IAM Roles for Service Accounts (IRSA) su EKS
  • Application Load Balancer interno per HTTPS

Prerequisiti

La procedura dettagliata crea le risorse proprie del gateway, ma si basa su infrastrutture di rete e identità che già possedete. Prima di iniziare, avete bisogno di:

Impostare le variabili di ambiente

Ogni comando in questa pagina legge quattro valori dalla vostra shell: AWS_REGION, ACCOUNT_ID, VPC_ID e PRIVATE_SUBNETS. Scegliete una regione US dove Bedrock serve i modelli Claude di cui avete bisogno. La procedura dettagliata si basa sul catalogo dei modelli integrato del gateway, che si risolve in profili di inferenza us.anthropic.*, e la politica IAM concede quegli ARN. In una regione non-US, aggiungete un blocco models: con gli ID del profilo di inferenza di quella geo e cambiate il prefisso ARN della politica IAM per corrispondere. Se non avete l’ID VPC a portata di mano, elencate i vostri VPC con aws ec2 describe-vpcs, quindi elencate le subnet di quel VPC per trovare due private in diverse zone di disponibilità:
Esportate tutti e quattro prima di continuare:

Distribuire il gateway

I passaggi seguenti eseguono il provisioning della distribuzione completa con comandi aws.
1

Creare i gruppi di sicurezza

Tre gruppi di sicurezza concatenano il percorso del traffico: la vostra rete aziendale raggiunge il load balancer sulla porta 443, il load balancer raggiunge il gateway sulla porta 8080 e il gateway raggiunge Postgres sulla porta 5432. Nient’altro è raggiungibile. Come li collegate dipende dal percorso di calcolo:
  • Su ECS Fargate, il passaggio di distribuzione allega $ALB_SG al load balancer e $GW_SG al servizio.
  • Su EKS, AWS Load Balancer Controller crea il proprio gruppo di sicurezza frontend per l’ALB, quindi $ALB_SG e $GW_SG non vengono utilizzati: l’annotazione inbound-cidrs del passaggio di distribuzione limita il listener alla vostra rete aziendale e il gruppo di sicurezza del database ammette il gruppo di sicurezza del cluster al posto di $GW_SG.
2

Creare i ruoli IAM e inviare il modulo del caso d'uso

Il gateway viene eseguito con un ruolo di attività dedicato la cui unica autorizzazione è invocare i modelli Claude su Bedrock. Secondo il riferimento upstream Bedrock, la politica deve coprire sia gli ARN del profilo di inferenza cross-region che gli ARN del modello di base sottostante:
ECS ha anche bisogno di un ruolo di esecuzione, che l’agente ECS stesso utilizza per estrarre l’immagine da ECR e iniettare i valori di Secrets Manager creati in seguito. È separato dal ruolo di attività che l’AWS SDK del gateway utilizza in fase di esecuzione:
I nomi della politica specificano un ARN per segreto piuttosto che un wildcard semplice gateway-*, che in un account condiviso corrisponderebbe anche a segreti non correlati; il suffisso finale -?????? corrisponde esattamente al suffisso di sei caratteri casuale che Secrets Manager aggiunge all’ARN di ogni segreto. Un -* finale sarebbe un glob di prefisso semplice e corrisponderebbe anche a nomi più lunghi come gateway-postgres-url-prod.La politica IAM concede al gateway il permesso di chiamare Bedrock, e Bedrock abilita l’accesso al modello per impostazione predefinita nelle regioni commerciali. Il gate rimanente a livello di account è il modulo del caso d’uso una tantum di Anthropic: se nessuno nel vostro account lo ha inviato, aprite la console Amazon Bedrock, selezionate un modello Anthropic dal catalogo dei modelli e completate il modulo. L’accesso viene concesso immediatamente dopo l’invio; consultate Claude Code su Amazon Bedrock per il modulo AWS Organizations e i permessi IAM di cui il mittente ha bisogno.Il percorso EKS riutilizza entrambi i documenti della politica su un ruolo IRSA al posto dei due ruoli ECS; consultate il passaggio di distribuzione.
3

Eseguire il provisioning di Amazon RDS per PostgreSQL

L’istanza viene eseguita nelle subnet private senza indirizzo pubblico e con crittografia dell’archiviazione attivata. La versione del motore è fissata a Postgres 16, che soddisfa il limite supportato del gateway di PostgreSQL 14 e garantisce che la famiglia del gruppo di parametri sottostante corrisponda all’istanza.Per prima cosa, create il gruppo di subnet che posiziona il database nelle subnet private e un gruppo di parametri con rds.force_ssl=1 in modo che il server rifiuti le connessioni in testo semplice. La versione del motore è fissata una volta perché la famiglia del gruppo di parametri deve corrispondere alla versione principale del motore che l’istanza esegue:
Quindi create l’istanza con una password principale generata:
L’argomento letterale --master-user-password è visibile nella tabella dei processi e nei log di audit/EDR mentre il comando viene eseguito, la stessa esposizione che la nota del passaggio dei segreti copre. Su un host condiviso o monitorato, passate la password tramite --cli-input-json da un file 0600 al posto, il modo in cui setup.sh del bundle lo fa.Attendete che l’istanza si avvii, il che può richiedere diversi minuti, quindi leggete il suo endpoint privato e assemblate la stringa di connessione che il gateway utilizzerà:
sslmode=verify-full fa sì che il gateway verifichi la catena del certificato del server RDS e il nome host, non solo crittografare. L’ancora di fiducia è il bundle di certificati AWS RDS, che il passaggio di compilazione dell’immagine sottostante copia in /etc/claude/rds-global-bundle.pem e affida tramite NODE_EXTRA_CA_CERTS. Non aggiungete un parametro sslrootcert= in stile libpq all’URL: il driver del gateway legge solo sslmode dalla stringa di query e inoltrerebbe sslrootcert a Postgres come parametro di avvio, che il server rifiuta.Il servizio ECS o i pod EKS devono essere eseguiti in questo VPC in modo che possano raggiungere l’endpoint privato dell’istanza, e il gruppo di sicurezza claude-gateway-db ammette solo il gruppo di sicurezza del gateway.
4

Scrivere gateway.yaml

Il blocco upstreams punta a Bedrock con auth: {}, quindi il gateway si autentica tramite la catena di credenziali predefinita di AWS dal ruolo di attività su ECS o dal ruolo IRSA su EKS. Consultate il riferimento di configurazione per ogni campo.Due campi listen descrivono cosa sta davanti al gateway:
  • public_url: l’origine esterna https://, obbligatoria per qualsiasi bind non-loopback; consultate il riferimento listen. Il gateway costruisce l’redirect_uri dell’IdP e il suo documento di scoperta solo da questo valore, mai da intestazioni X-Forwarded-*.
  • trusted_proxies: gli intervalli di origine del front end. Il gateway onora X-Forwarded-For solo quando il peer TCP è in questo elenco, quindi cammina nella catena oltre i hop affidabili, in modo che i limiti di velocità di accesso per IP e gli eventi di audit registrino gli IP degli sviluppatori al posto di quello del load balancer.
Su entrambi i percorsi il front end è un ALB interno, creato direttamente o da AWS Load Balancer Controller, e i nodi di un ALB prendono indirizzi dalle subnet a cui è collegato, quindi impostate trusted_proxies ai CIDR di quelle subnet. Questo affida ogni host in quelle subnet come proxy. Evitate che l’origine di ingresso dell’ALB, il vostro CIDR aziendale, si sovrapponga ad essi, e non condividete le subnet con carichi di lavoro non affidabili che potrebbero falsificare gli IP dei client tramite X-Forwarded-For.L’attributo di conservazione del client port dell’ALB, routing.http.xff_client_port.enabled, può rimanere a entrambe le impostazioni: con esso attivato, l’ALB scrive il client come 203.0.113.7:54321 o [2001:db8::1]:54321, e il gateway legge entrambi con la porta eliminata.
gateway.yaml
Solo il blocco oidc è specifico di Okta. Per utilizzare Microsoft Entra ID al posto, impostate issuer su https://login.microsoftonline.com/<tenant-id>/v2.0, eliminate userinfo_fallback e lo scope groups, e notate che Entra emette Object ID dei gruppi piuttosto che nomi, quindi managed.policies deve corrispondere ai GUID, o su App Roles con oidc.groups_claim: roles. Consultate Configurazione del provider di identità.
5

Archiviare i segreti in AWS Secrets Manager

Create tre segreti; il ruolo di esecuzione dal passaggio IAM può già leggerli:
Notate l’ARN che ogni chiamata stampa; la definizione di attività ECS fa riferimento ai segreti per ARN.
Gli argomenti letterali --secret-string sono visibili nella tabella dei processi e nei log di audit/EDR mentre ogni comando viene eseguito. Su un host condiviso o monitorato, mettete il valore in un file 0600 e passate --secret-string file://<path> al posto. setup.sh del bundle mantiene i valori dei segreti fuori da argv del processo allo stesso modo, passando file temporanei 0600 a --cli-input-json.
A differenza dei segreti, gateway.yaml stesso non contiene valori segreti, perché ogni credenziale si risolve all’avvio tramite l’espansione ${VAR} o ${file:...}. Come tutto raggiunge il contenitore differisce per percorso:
  • Su ECS, il passaggio di compilazione successivo copia gateway.yaml nell’immagine a /etc/claude/gateway.yaml, e la definizione di attività inietta i tre segreti come variabili di ambiente tramite il suo campo secrets, quindi lo YAML fa riferimento a ${GATEWAY_JWT_SECRET}, ${OIDC_CLIENT_SECRET} e ${GATEWAY_POSTGRES_URL}.
  • Su EKS, montate gateway.yaml da una ConfigMap e i segreti come file a /secrets, referenziati come ${file:/secrets/...}. Originare i Kubernetes Secrets da Secrets Manager con External Secrets Operator o il provider AWS del driver CSI Secrets Store, o crearli direttamente con kubectl.
6

Compilare e spingere l'immagine ad Amazon ECR

Compilate l’immagine secondo i requisiti dell’immagine del contenitore, posizionando il binario glibc linux-x64 a ./claude nel contesto di compilazione. Scrivete il vostro Dockerfile secondo questi requisiti o iniziate dal Dockerfile del bundle, che copia il gateway.yaml compilato dai passaggi precedenti nell’immagine a /etc/claude/gateway.yaml. Su ECS quella copia incorporata è come la configurazione raggiunge il contenitore, motivo per cui la compilazione viene dopo che il file è stato scritto. Il percorso EKS al posto monta gateway.yaml da una ConfigMap al momento della distribuzione, quindi la copia incorporata non viene utilizzata lì.L’immagine porta anche il bundle di certificati AWS RDS come ancora di fiducia per la stringa di connessione sslmode=verify-full, quindi scaricatelo nel contesto di compilazione per primo. AWS ruota il bundle (nuove CA regionali vengono aggiunte), quindi scaricatelo per compilazione piuttosto che fissare un checksum o impegnarlo:
I requisiti dell’immagine del contenitore non coprono il bundle, quindi se scrivete il vostro Dockerfile, aggiungete le due righe che lo copiano e lo affidano; il Dockerfile del bundle include già entrambi:
Create il repository ECR e accedete Docker ad esso. I tag immutabili significano che il tag <version> che il passaggio di distribuzione fissa non può essere successivamente reindirizzato silenziosamente a un’immagine diversa:
Compilate e spingete l’immagine. La definizione di attività sottostante esegue linux/amd64, quindi la piattaforma deve corrispondere qui; per Fargate su ARM64 (Graviton), compilate linux/arm64 con il binario linux-arm64 e impostate cpuArchitecture su ARM64 al posto:
7

Distribuire

Create il cluster e un gruppo di log per stderr del gateway, che porta sia i suoi eventi di audit che i log operazionali. La conservazione è una chiamata separata, e senza una CloudWatch mantiene i log per sempre; allineate i 90 giorni con la vostra politica di conservazione dell’audit:
Scrivete la definizione di attività. Il ruolo di attività porta il permesso Bedrock e il ruolo di esecuzione inietta i segreti; utilizzate gli ARN dei segreti dal passaggio Secrets Manager:
claude-gateway-task.json
Registratela:
Mettete un ALB interno davanti con un gruppo di destinazione che verifica lo stato del gateway. --ip-address-type ipv4 è importante: un ALB interno dual-stack pubblica record AAAA di intervallo pubblico, che il controllo della rete privata /login rifiuta:
Aggiungete il listener HTTPS. --ssl-policy fissa un limite TLS moderno, poiché ometterlo ricade nella politica predefinita legacy ELBSecurityPolicy-2016-08, che ancora accetta TLS 1.0/1.1.L’ALB chiude una connessione dopo 60 secondi senza dati per impostazione predefinita. I ping di keepalive del gateway mantengono i flussi entro quel default, quindi aumentare il timeout aggiunge margine sopra la cadenza del ping; la riga Troubleshooting sui flussi interrotti copre il meccanismo e i gateway più vecchi. I comandi sottostanti aggiungono il listener e aumentano il timeout:
Create il servizio. Il circuito di distribuzione del deployment fa rotolare una distribuzione le cui attività continuano a fallire, da un’immagine cattiva o una configurazione non avviabile, indietro allo stato stabile precedente al posto di rilanciare attività fallite per sempre:
Il periodo di grazia di 60 secondi dà a un’attività fredda il tempo di estrarre l’immagine, connettersi allo store e rispondere al suo primo controllo di stato prima che ECS inizi a contare i fallimenti rispetto alla distribuzione. Il controllo di stato del gruppo di destinazione su GET /readyz verifica che lo store sia raggiungibile, quindi un’attività che non può raggiungere Postgres non entra mai in rotazione; consultate Comportamento di interruzione per il compromesso e l’alternativa /healthz.Le attività vengono eseguite in subnet private senza IP pubblico, quindi tutto l’egresso (verso Bedrock, il vostro IdP, Secrets Manager, ECR e CloudWatch Logs) passa attraverso il gateway NAT. Per mantenere il traffico Bedrock fuori dal percorso pubblico, create un endpoint VPC dell’interfaccia bedrock-runtime e puntate l’base_url dell’upstream ad esso, come mostrato nel riferimento upstream Bedrock; l’IdP ha ancora bisogno di uscita a Internet.Finite dando agli sviluppatori un nome host risolvibile privatamente: in una zona ospitata privata Route 53, alias il nome DNS interno del gateway all’ALB, e impostate listen.public_url a quel nome host. Il nome *.elb.amazonaws.com dell’ALB stesso si risolve in indirizzi privati su un ALB interno, ma non può portare il vostro certificato ACM, quindi utilizzate il vostro nome.Aggiornate l’URI di reindirizzamento autorizzato del client OAuth a <public_url>/oauth/callback prima del primo accesso. Dopo aver cambiato public_url, ricompilate e spingete l’immagine sotto un nuovo tag, registrate una nuova revisione della definizione di attività e ridistribuite. Su ECS l’impostazione vive nel gateway.yaml incorporato dell’immagine, e il gateway costruisce la sua origine pubblica solo da quell’impostazione, ignorando X-Forwarded-Host e X-Forwarded-Proto. X-Forwarded-For è onorato per gli IP dei client solo quando listen.trusted_proxies è impostato.
8

Spingere l'URL del gateway alle macchine degli sviluppatori

Il gateway è ora in esecuzione, ma gli sviluppatori non possono raggiungerlo da /login fino a quando l’URL del gateway non è sulle loro macchine. Impostate forceLoginMethod e forceLoginGatewayUrl nel file delle impostazioni gestite che distribuite a ogni dispositivo tramite MDM. Non c’è opzione di gateway nel selettore di accesso per uno sviluppatore da selezionare manualmente.

Riferimento Terraform

Il bundle complementare a examples/gateway/aws pacchetti questa pagina come codice:
  • setup.sh script la procedura dettagliata di provisioning sopra con gli stessi comandi aws, sul percorso ECS Fargate. È idempotente: le risorse esistenti vengono rilevate e saltate, quindi rieseguirlo è sicuro, e qualsiasi default può essere sovrascritto tramite variabile di ambiente. Voi create comunque il segreto del client OIDC Okta e il certificato ACM voi stessi: un’esecuzione senza di essi salta la distribuzione ECS/ALB, nomina gli input mancanti e stampa il comando create-secret; create entrambi e rieseguite. Il modulo del caso d’uso Bedrock e l’alias Route 53 vengono stampati come passaggi successivi piuttosto che eseguiti automaticamente, e il push MDM del client rimane un passaggio manuale da questa pagina.
  • gateway.yaml.example è il modello di configurazione dal passaggio gateway.yaml, con le chiavi opzionali incluse commentate. Copiatelo in gateway.yaml e sostituite ogni REPLACE_ME prima di compilare.
  • Dockerfile compila l’immagine di runtime dal binario precompilato linux-x64 e copia il vostro gateway.yaml compilato a /etc/claude/gateway.yaml, più il bundle di certificati AWS RDS che ancora la connessione sslmode=verify-full dello store. setup.sh scarica il bundle solo quando non è già nel contesto di compilazione; eliminate il file e ricompilate sotto un nuovo tag per raccogliere una rotazione CA di AWS. Il file di configurazione non contiene valori segreti, poiché ogni credenziale si risolve all’avvio tramite l’espansione ${VAR}. Una modifica della configurazione quindi significa una ricompilazione sotto un nuovo tag; setup.sh automatizza questo taggando le immagini con un hash del file.
  • terraform/ esegue il provisioning dello stesso ambito ECS Fargate in modo dichiarativo: i gruppi di sicurezza, i ruoli IAM, il repository ECR, l’istanza RDS, i segreti di Secrets Manager e il servizio ECS dietro l’ALB interno. Il VPC e le subnet private rimangono prerequisiti, passati come variabili. Terraform crea il repository ECR ma non compila l’immagine, e la definizione del servizio fa riferimento all’immagine, quindi l’apply è due passaggi: un apply mirato per il repository, quindi la compilazione e il push, quindi l’apply completo. Il terraform/README.md del bundle copre le variabili, lo stato remoto e lo smantellamento.
Come questa pagina, il bundle è un esempio funzionante per infrastrutture gestite dal cliente piuttosto che una distribuzione di produzione supportata; esaminate e adattate al vostro ambiente prima di affidarvi ad esso.

Troubleshooting

Per gli errori di avvio del gateway e di accesso, consultate la tabella di troubleshooting indipendente dalla piattaforma. Le voci sottostanti sono specifiche di AWS.

Telemetria

Il gateway vi fornisce metriche di utilizzo per sviluppatore senza alcuna configurazione OTEL per macchina. Claude Code emette metriche, log e tracce OpenTelemetry (OTLP) opt-in; Monitoraggio dell’utilizzo copre tutto ciò che il CLI segnala. Sulle sessioni del gateway il CLI marca ogni esportazione con gli attributi di identità IdP autenticati user.id, user.email e user.groups, quindi l’utilizzo si accumula per sviluppatore senza alcun plumbing OTEL_RESOURCE_ATTRIBUTES. Il gateway stesso è un relè OTLP autenticato. Impostate telemetry.forward_to insieme a listen.public_url, e spinge le impostazioni dell’esportatore OTEL a ogni client connesso e inoltra il loro traffico OTLP verbatim a ogni destinazione che elencate. Ogni destinazione opta per metriche, log e tracce indipendentemente, e l’impostazione predefinita è solo metriche; consultate il riferimento telemetry per i campi per segnale e i loro compromessi di sensibilità. Il gateway non memorizza nel buffer, aggrega o archivia la telemetria, quindi dove i dati finiscono è interamente la configurazione dell’esportatore del collettore. La telemetria del client è disattivata per impostazione predefinita; configurare telemetry.forward_to è ciò che la attiva per gli sviluppatori connessi, e ogni client interattivo mostra una finestra di dialogo di approvazione della sicurezza una tantum per le impostazioni spinte, come descritto nel riferimento di configurazione. Su AWS, ogni segnale mappa a una destinazione come segue.

Metriche, log e tracce del client

Puntate telemetry.forward_to a un collettore OpenTelemetry, come il collettore AWS Distro for OpenTelemetry (ADOT), ed esportate da lì ad Amazon CloudWatch, Amazon Managed Service for Prometheus, o qualsiasi backend OTLP. Eseguite il collettore come suo proprio servizio interno raggiungibile su https://; il riferimento telemetry copre l’eccezione di loopback e CLAUDE_GATEWAY_ALLOW_LOOPBACK.

Log del gateway

Su ECS Fargate, nessuna configurazione extra: il driver awslogs consegna stderr del gateway, che porta i suoi eventi di audit e log operazionali, al gruppo di log /ecs/claude-gateway creato sopra. Su EKS, i log dei pod non raggiungono CloudWatch per impostazione predefinita, quindi la traccia di audit viene persa fino a quando non installate la raccolta dei log: il componente aggiuntivo Amazon CloudWatch Observability con acquisizione dei log del contenitore abilitata, o un DaemonSet Fluent Bit. Su entrambi i percorsi, interrogate i log con CloudWatch Logs Insights e guidate gli allarmi dai filtri delle metriche.

Metriche del contenitore

Abilitate Container Insights sul cluster con aws ecs update-cluster-settings --cluster claude-gateway --settings name=containerInsights,value=enabled per CPU, memoria e rete per attività. Su EKS, installate il componente aggiuntivo Amazon CloudWatch Observability.

Spesa

La telemetria mostra l’utilizzo dopo il fatto; i limiti di spesa sono la vista live del gateway per sviluppatore e l’applicazione sulla credenziale upstream condivisa.

Passaggi successivi