Architettura
L'architettura di esempio, con Amazon Bedrock come upstream del modello. Un upstream Claude Platform su AWS occupa la stessa posizione.
- 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:InvokeModelWithResponseStreamebedrock: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:- Un account AWS con autorizzazione per creare le risorse sopra
- AWS CLI v2 installata e autenticata, e Docker installato localmente
- Un VPC con almeno due subnet private in diverse zone di disponibilità, con accesso a Internet in uscita tramite un gateway NAT; il load balancer interno ha bisogno di subnet in due AZ e il gateway ha bisogno di uscita verso Bedrock e il vostro IdP
- Un’applicazione web OIDC Okta con URI di reindirizzamento
https://<gateway-host>/oauth/callback; consultate Configurazione del provider di identità - Un nome host TLS per il gateway, tipicamente un nome DNS interno in una zona ospitata privata Route 53 che punta al load balancer, con un certificato ACM per quel nome, importato o emesso da AWS Private CA
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à:
Eseguire il deploy del gateway
I passaggi seguenti eseguono il provisioning del deploy completo con comandiaws.
Creare i gruppi di sicurezza
- Su ECS Fargate, il passaggio di deploy collega
$ALB_SGal load balancer e$GW_SGal servizio. - Su EKS, AWS Load Balancer Controller crea il proprio gruppo di sicurezza frontend per l’ALB, quindi
$ALB_SGe$GW_SGnon vengono utilizzati: l’annotazioneinbound-cidrsdel passaggio di deploy limita il listener alla tua rete aziendale e il gruppo di sicurezza del database ammette invece il gruppo di sicurezza del cluster.
Creare i ruoli IAM e inviare il modulo del caso d'uso
gateway-*, che in un account condiviso corrisponderebbe anche a segreti non correlati; il suffisso finale -?????? corrisponde esattamente al suffisso casuale di sei caratteri che Secrets Manager aggiunge all’ARN di ogni segreto. Un -* finale sarebbe un semplice glob di prefisso e corrisponderebbe anche a nomi più lunghi come gateway-postgres-url-prod.La policy IAM concede al gateway il permesso di chiamare Bedrock, e Bedrock abilita l’accesso ai modelli per impostazione predefinita nelle regioni commerciali. Il vincolo rimanente a livello di account è il modulo del caso d’uso una tantum di Anthropic: se nessuno nel tuo account lo ha inviato, apri la console Amazon Bedrock, seleziona un modello Anthropic dal catalogo dei modelli e compila il modulo. L’accesso viene concesso immediatamente dopo l’invio; consulta Claude Code su Amazon Bedrock per il modulo AWS Organizations e i permessi IAM di cui ha bisogno chi lo invia.Il percorso EKS riutilizza entrambi i documenti di policy su un ruolo IRSA al posto dei due ruoli ECS; consulta il passaggio di deploy.Eseguire il provisioning di Amazon RDS per PostgreSQL
rds.force_ssl=1 in modo che il server rifiuti le connessioni in testo semplice. La versione del motore viene fissata una sola volta perché la famiglia del gruppo di parametri deve corrispondere alla versione principale del motore eseguita dall’istanza:--master-user-password è visibile nella tabella dei processi e nei log di audit/EDR mentre il comando è in esecuzione, la stessa esposizione trattata nella nota del passaggio dei segreti. Su un host condiviso o monitorato, passa invece la password tramite --cli-input-json da un file 0600, come fa il setup.sh del bundle.Attendi che l’istanza sia disponibile, il che può richiedere diversi minuti, quindi leggi il suo endpoint privato e componi la stringa di connessione che il gateway utilizzerà:sslmode=verify-full fa sì che il gateway verifichi la catena e il nome host del certificato del server RDS, e non si limiti a crittografare. L’ancora di fiducia è il bundle di certificati AWS RDS, che il passaggio di build dell’immagine più avanti copia in /etc/claude/rds-global-bundle.pem e considera attendibile tramite NODE_EXTRA_CA_CERTS. Non aggiungere all’URL un parametro sslrootcert= in stile libpq: 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 per poter raggiungere l’endpoint privato dell’istanza, e il gruppo di sicurezza claude-gateway-db ammette solo il gruppo di sicurezza del gateway.Scrivere gateway.yaml
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. Consulta il riferimento di configurazione per ogni campo.Due campi listen descrivono ciò che sta davanti al gateway:public_url: l’origine esternahttps://, obbligatoria per qualsiasi bind non di loopback; consulta il riferimentolisten. Il gateway costruisce ilredirect_uridell’IdP e il proprio documento di discovery solo da questo valore, mai dalle intestazioniX-Forwarded-*.trusted_proxies: gli intervalli di origine del front end. Il gateway consideraX-Forwarded-Forsolo quando il peer TCP è in questo elenco, quindi percorre la catena oltre gli hop attendibili, in modo che i rate limit di accesso per IP e gli eventi di audit registrino gli IP degli sviluppatori anziché quelli del load balancer.
trusted_proxies sui CIDR di quelle subnet. In questo modo ogni host in quelle subnet viene considerato un proxy attendibile. Evita che l’origine di ingresso dell’ALB, il tuo CIDR aziendale, si sovrapponga a esse, e non condividere le subnet con carichi di lavoro non attendibili che potrebbero falsificare gli IP dei client tramite X-Forwarded-For.L’attributo di conservazione della porta del client dell’ALB, routing.http.xff_client_port.enabled, può restare su entrambe le impostazioni: se è attivo, l’ALB scrive il client come 203.0.113.7:54321 o [2001:db8::1]:54321, e il gateway legge entrambi i formati scartando la porta.oidc è specifico di Okta. Per utilizzare invece Microsoft Entra ID, imposta issuer su https://login.microsoftonline.com/<tenant-id>/v2.0, rimuovi userinfo_fallback e lo scope groups, e tieni presente che Entra emette gli Object ID dei gruppi anziché i nomi, quindi managed.policies deve corrispondere ai GUID, oppure agli App Roles con oidc.groups_claim: roles. Consulta Configurazione del provider di identità.Archiviare i segreti in AWS Secrets Manager
--secret-string sono visibili nella tabella dei processi e nei log di audit/EDR mentre ogni comando è in esecuzione. Su un host condiviso o monitorato, inserisci invece il valore in un file 0600 e passa --secret-string file://<path>. Il setup.sh del bundle tiene allo stesso modo i valori dei segreti fuori dagli argv dei processi, passando file temporanei 0600 a --cli-input-json.gateway.yaml non contiene valori segreti, perché ogni credenziale viene risolta all’avvio tramite l’espansione ${VAR} o ${file:...}. Il modo in cui tutto arriva al container varia in base al percorso:- Su ECS, la build del passaggio successivo copia
gateway.yamlnell’immagine in/etc/claude/gateway.yaml, e la definizione di attività inietta i tre segreti come variabili d’ambiente tramite il suo camposecrets, quindi lo YAML fa riferimento a${GATEWAY_JWT_SECRET},${OIDC_CLIENT_SECRET}e${GATEWAY_POSTGRES_URL}. - Su EKS, monta
gateway.yamlda una ConfigMap e i segreti come file in/secrets, referenziati come${file:/secrets/...}. Ricava i Kubernetes Secrets da Secrets Manager con External Secrets Operator o con il provider AWS del driver CSI Secrets Store, oppure creali direttamente conkubectl.
Eseguire la build e il push dell'immagine su Amazon ECR
linux-x64 in ./claude nel contesto di build. Scrivi il tuo Dockerfile secondo questi requisiti oppure parti dal Dockerfile del bundle, che copia il gateway.yaml compilato nei passaggi precedenti nell’immagine in /etc/claude/gateway.yaml. Su ECS è questa copia incorporata a portare la configurazione nel container, ed è per questo che la build viene dopo la scrittura del file. Il percorso EKS monta invece gateway.yaml da una ConfigMap al momento del deploy, quindi lì la copia incorporata non viene utilizzata.L’immagine contiene anche il bundle di certificati AWS RDS come ancora di fiducia per il sslmode=verify-full della stringa di connessione, quindi scaricalo prima nel contesto di build. AWS aggiorna periodicamente il bundle (vengono aggiunte nuove CA regionali), quindi scaricalo a ogni build anziché fissarne un checksum o eseguirne il commit:Dockerfile del bundle le include già entrambe:<version> fissato nel passaggio di deploy non possa essere in seguito reindirizzato silenziosamente a un’immagine diversa:linux/amd64, quindi la piattaforma deve corrispondere qui; per Fargate su ARM64 (Graviton), esegui invece la build per linux/arm64 con il binario linux-arm64 e imposta cpuArchitecture su ARM64:Eseguire il deploy
- ECS Fargate
- EKS
--ip-address-type ipv4 è importante: un ALB interno dual-stack pubblica record AAAA di intervallo pubblico, che il controllo della rete privata di /login rifiuta:--ssl-policy fissa un livello minimo di TLS moderno, poiché ometterlo fa ricadere sulla policy predefinita legacy ELBSecurityPolicy-2016-08, che accetta ancora TLS 1.0/1.1.Per impostazione predefinita, l’ALB chiude una connessione dopo 60 secondi senza dati. I ping di keepalive del gateway mantengono i flussi entro questo valore predefinito, quindi aumentare il timeout aggiunge margine rispetto alla cadenza dei ping; la riga di Risoluzione dei problemi sui flussi interrotti descrive il meccanismo e i gateway meno recenti. I comandi seguenti aggiungono il listener e aumentano il timeout:GET /readyz verifica che lo store sia raggiungibile, quindi un’attività che non riesce a raggiungere Postgres non entra mai in rotazione. Per far sì che le attività continuino a superare il controllo durante una breve interruzione del database, come un failover RDS, imposta store.readiness_grace_seconds come descritto in Comportamento in caso di interruzione, che tratta anche l’alternativa /healthz.Le attività vengono eseguite in subnet private senza IP pubblico, quindi tutto il traffico in uscita (verso Bedrock, il tuo IdP, Secrets Manager, ECR e CloudWatch Logs) passa attraverso il gateway NAT. Per tenere il traffico Bedrock fuori dal percorso pubblico, crea un endpoint VPC di interfaccia bedrock-runtime e punta il base_url dell’upstream a esso, come mostrato nel riferimento upstream Bedrock; l’IdP ha comunque bisogno di uscita verso Internet.Per finire, fornisci agli sviluppatori un nome host risolvibile privatamente: in una zona ospitata privata di Route 53, crea un alias dal nome DNS interno del gateway all’ALB e imposta listen.public_url su quel nome host. Il nome *.elb.amazonaws.com dell’ALB si risolve in indirizzi privati su un ALB interno, ma non può usare il tuo certificato ACM, quindi usa un nome tuo.Aggiorna l’URI di reindirizzamento autorizzato del client OAuth a <public_url>/oauth/callback prima del primo accesso. Dopo aver modificato public_url, esegui di nuovo la build e il push dell’immagine con un nuovo tag, registra una nuova revisione della definizione di attività ed esegui di nuovo il deploy. Su ECS l’impostazione si trova nel gateway.yaml incorporato nell’immagine, e il gateway costruisce la propria origine pubblica solo da quell’impostazione, ignorando X-Forwarded-Host e X-Forwarded-Proto. X-Forwarded-For viene considerato per gli IP dei client solo quando listen.trusted_proxies è impostato.Distribuire l'URL del gateway ai computer degli sviluppatori
/login finché l’URL del gateway non è presente sui loro computer. Distribuisci lo snippet completo delle impostazioni gestite, con forceLoginMethod, forceLoginGatewayUrl e l’opt-in parentSettingsBehavior: "merge", su ogni dispositivo tramite MDM. Nel selettore di accesso non esiste un’opzione gateway che uno sviluppatore possa selezionare manualmente.Riferimento Terraform
Il bundle complementare aexamples/gateway/aws pacchetti questa pagina come codice:
setup.shscript la procedura dettagliata di provisioning sopra con gli stessi comandiaws, 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 comandocreate-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 ingateway.yamle sostituite ogniREPLACE_MEprima di compilare.Dockerfilecompila l’immagine di runtime dal binario precompilatolinux-x64e copia il vostrogateway.yamlcompilato a/etc/claude/gateway.yaml, più il bundle di certificati AWS RDS che ancora la connessionesslmode=verify-fulldello store.setup.shscarica 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.shautomatizza 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. Ilterraform/README.mddel bundle copre le variabili, lo stato remoto e lo smantellamento.
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.Telemetry
Il gateway ti fornisce metriche di utilizzo per sviluppatore senza alcuna configurazione OTEL per macchina. Claude Code emette metriche, log e tracce opzionali OpenTelemetry (OTLP); Monitorare l’utilizzo copre tutto ciò che il CLI segnala. Nelle sessioni in cui l’accesso è stato effettuato tramite/login, il CLI contrassegna ogni esportazione con gli attributi di identità IdP autenticati user.id, user.email e user.groups, in modo che l’utilizzo venga aggregato per sviluppatore.
Il gateway stesso è un relay OTLP autenticato. Impostare telemetry.forward_to insieme a listen.public_url, e spingerà le impostazioni dell’esportatore OTEL a ogni client connesso e inoltrerà il loro traffico OTLP verbatim a ogni destinazione che elencate. Ogni destinazione acconsente a metriche, log e tracce indipendentemente, e l’impostazione predefinita è solo metriche; vedere il riferimento telemetry per i campi per segnale e i loro compromessi di sensibilità. Il gateway non memorizza nel buffer, non aggrega e non archivia telemetria, quindi il luogo in cui i dati arrivano dipende interamente dalla configurazione dell’esportatore del collector.
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 per le impostazioni inviate, come descritto nel riferimento di configurazione. Su AWS, ogni segnale viene mappato a una destinazione come segue.
Client metrics, logs, and traces
Puntaretelemetry.forward_to a un collector OpenTelemetry, come il AWS Distro for OpenTelemetry (ADOT) collector, ed esportare da lì ad Amazon CloudWatch, Amazon Managed Service for Prometheus, o qualsiasi backend OTLP.
Eseguire il collector come servizio interno proprio raggiungibile su https://; il riferimento telemetry copre l’eccezione di loopback e CLAUDE_GATEWAY_ALLOW_LOOPBACK.
Gateway logs
Su ECS Fargate, nessuna configurazione aggiuntiva: il driverawslogs consegna stderr del gateway, che contiene i suoi eventi di audit e log operativi, al gruppo di log /ecs/claude-gateway creato sopra. Su EKS, i log dei pod non raggiungono CloudWatch per impostazione predefinita, quindi l’audit trail viene perso fino a quando non installate la raccolta dei log: il componente aggiuntivo Amazon CloudWatch Observability con acquisizione dei log dei container abilitata, o un DaemonSet Fluent Bit. Su entrambi i percorsi, interrogare i log con CloudWatch Logs Insights e guidare gli allarmi dai filtri metrici.
Container metrics
Abilitare Container Insights sul cluster conaws ecs update-cluster-settings --cluster claude-gateway --settings name=containerInsights,value=enabled per CPU, memoria e rete per attività. Su EKS, installare il componente aggiuntivo Amazon CloudWatch Observability.
Spend
La telemetria mostra l’utilizzo dopo il fatto; i limiti di spesa sono la vista e l’applicazione live per sviluppatore del gateway.Attribuzione dei costi
Il gateway firma ogni richiesta Bedrock con il suo principale, il ruolo dell’attività ECS o il ruolo IRSA di EKS, quindi per impostazione predefinita AWS vede tutta quella spesa sotto un unico principale IAM. Ci sono due modi per dividerla nei dati di fatturazione di AWS, e si combinano.Per sviluppatore con assume_role
Creare un secondo ruolo IAM che contiene le autorizzazioni Bedrock e si fida del principale del gateway, concedere a quel principale sts:AssumeRole su di esso, e impostare assume_role con session_name: email sull’upstream Bedrock. Il gateway assume quindi quel ruolo una volta per sviluppatore all’ora con il nome della sessione impostato sulla loro email e firma le loro richieste con il risultato. Richiede un gateway che esegue Claude Code v2.1.281 o successivo. Il ruolo può trovarsi anche in un altro account AWS: vedere Bedrock in un altro account AWS. In Terraform, accanto al ruolo dell’attività nel bundle Terraform:
assume_role impostato il gateway firma ogni chiamata Bedrock, la chiamata gratuita CountTokens per la misurazione della spesa inclusa, con le credenziali del ruolo assunto, quindi il principale del gateway ha bisogno di una politica Bedrock propria solo per un upstream senza assume_role.
Poiché il gateway chiama STS al momento della richiesta, le subnet private hanno bisogno di un percorso verso sts.<region>.amazonaws.com. Il gateway NAT dai prerequisiti fornisce uno, così come un endpoint VPC dell’interfaccia STS che risponde per quel nome host. Ogni sviluppatore attivo costa una chiamata STS all’ora per replica del gateway.
Le richieste di ogni sviluppatore raggiungono AWS come il principale arn:aws:sts::<account>:assumed-role/<role>/<email>. Per visualizzare la spesa per principale, utilizzare un’esportazione di fatturazione che includa i dati del principale IAM; la pagina allocazione dei costi del principale IAM di AWS spiega come abilitarla e quali strumenti di fatturazione la mostrano.
Per team con profili di inferenza dell’applicazione
Questo percorso utilizza solo le sezionimodels e managed. Creare un profilo di inferenza dell’applicazione Bedrock per team e modello, taggare ogni profilo con il team, e attivare quel tag come tag di allocazione dei costi. Quindi fornire a ogni team il suo proprio id modello in gateway.yaml e fissare ogni gruppo IdP agli id del suo team:
--model platform-claude-opus-4-8, utilizzando l’id del loro team, perché una sessione avviata senza di esso esegue il modello predefinito, che il gateway rifiuta per loro.
Il gateway applica availableModels su ogni richiesta, non solo nel selezionatore di modelli, e la fatturazione di AWS raggruppa la spesa per il tag che hai attivato. Senza il catch-all match: {}, uno sviluppatore che non corrisponde a nessuna politica ottiene ogni modello nel catalogo e può fatturare il profilo di entrambi i team.
I costi: la configurazione cresce con i team per i modelli, e il ruolo che firma le richieste Bedrock di questo upstream deve anche essere autorizzato a invocare gli ARN application-inference-profile/*. Quel ruolo è il principale del gateway, o con assume_role il ruolo che assume. Vedere pricing per come il misuratore di spesa proprio del gateway prezza questi id.
Passaggi successivi
- Riferimento di configurazione: ogni opzione
gateway.yaml, inclusimanaged.policiesetelemetry - Distribuzione e operazioni: configurazione IdP, controlli di stato, rotazione della chiave segreta JWT, aggiornamenti e il modello di sicurezza
- Panoramica del gateway delle app Claude: quickstart e connessione degli sviluppatori
- Esempi AWS per il gateway delle app Claude: esempi di distribuzione mantenuti da AWS che coprono una gamma di ambienti dei clienti