Architecture
L'architecture d'exemple, avec Amazon Bedrock comme upstream de modèle. Un upstream Claude Platform on AWS occupe la même position.
- Un service Amazon ECS sur AWS Fargate ou un Amazon EKS Deployment exécutant le conteneur de la passerelle
- Un référentiel Amazon ECR pour l’image de la passerelle
- Une instance Amazon RDS pour PostgreSQL dans des sous-réseaux privés, non accessible publiquement, pour le store de la passerelle
- Des secrets AWS Secrets Manager pour la clé de signature JWT, le secret client OIDC et l’URL Postgres
- Un rôle IAM avec
bedrock:InvokeModel,bedrock:InvokeModelWithResponseStreametbedrock:CountTokens, attaché en tant que rôle de tâche ECS ou lié via IAM Roles for Service Accounts (IRSA) sur EKS - Un équilibreur de charge d’application interne pour HTTPS
Prérequis
La procédure pas à pas crée les ressources propres de la passerelle, mais elle s’appuie sur une infrastructure réseau et d’identité que vous avez déjà. Avant de commencer, vous avez besoin de :- Un compte AWS avec la permission de créer les ressources ci-dessus
- AWS CLI v2 installée et authentifiée, et Docker installé localement
- Un VPC avec au moins deux sous-réseaux privés dans différentes zones de disponibilité, avec accès Internet sortant via une passerelle NAT ; l’équilibreur de charge interne a besoin de sous-réseaux dans deux zones de disponibilité, et la passerelle a besoin d’une sortie vers Bedrock et votre IdP
- Une application web OIDC Okta avec l’URI de redirection
https://<gateway-host>/oauth/callback; consultez Configuration du fournisseur d’identité - Un nom d’hôte TLS pour la passerelle, généralement un nom DNS interne dans une zone hébergée privée Route 53 pointant vers l’équilibreur de charge, avec un certificat ACM pour ce nom, importé ou émis par AWS Private CA
Définir vos variables d’environnement
Chaque commande de cette page lit quatre valeurs de votre shell :AWS_REGION, ACCOUNT_ID, VPC_ID et PRIVATE_SUBNETS.
Choisissez une région US où Bedrock sert les modèles Claude dont vous avez besoin. La procédure pas à pas s’appuie sur le catalogue de modèles intégré de la passerelle, qui se résout en profils d’inférence us.anthropic.*, et la politique IAM accorde ces ARN. Dans une région non-US, ajoutez un bloc models: avec les ID de profil d’inférence de cette géographie et modifiez le préfixe ARN de la politique IAM pour qu’il corresponde.
Si vous n’avez pas l’ID du VPC à portée de main, listez vos VPC avec aws ec2 describe-vpcs, puis listez les sous-réseaux de ce VPC pour trouver deux sous-réseaux privés dans différentes zones de disponibilité :
Déployer la passerelle
Les étapes ci-dessous provisionent le déploiement complet avec des commandesaws.
Créer les groupes de sécurité
- Sur ECS Fargate, l’étape de déploiement attache
$ALB_SGà l’équilibreur de charge et$GW_SGau service. - Sur EKS, le contrôleur AWS Load Balancer crée son propre groupe de sécurité frontal pour l’ALB, donc
$ALB_SGet$GW_SGne sont pas utilisés : l’annotationinbound-cidrsde l’étape de déploiement restreint l’écouteur à votre réseau d’entreprise, et le groupe de sécurité de la base de données admet le groupe de sécurité du cluster à la place.
Créer les rôles IAM et soumettre le formulaire de cas d'usage
gateway-*, qui dans un compte partagé correspondrait également à des secrets non liés ; le suffixe -?????? à la fin correspond exactement au suffixe aléatoire de six caractères que Secrets Manager ajoute à l’ARN de chaque secret. Un -* à la fin serait un glob de préfixe simple et correspondrait également à des noms plus longs tels que gateway-postgres-url-prod.La politique IAM accorde à la passerelle la permission d’appeler Bedrock, et Bedrock active l’accès au modèle par défaut dans les régions commerciales. La porte au niveau du compte restante est le formulaire de cas d’usage unique d’Anthropic : si personne dans votre compte ne l’a soumis, ouvrez la console Amazon Bedrock, sélectionnez un modèle Anthropic dans le catalogue de modèles et complétez le formulaire. L’accès est accordé immédiatement après la soumission ; consultez Claude Code sur Amazon Bedrock pour le formulaire AWS Organizations et les permissions IAM dont le soumetteur a besoin.La piste EKS réutilise les deux documents de politique sur un rôle IRSA à la place des deux rôles ECS ; consultez l’étape de déploiement.Provisionner Amazon RDS pour PostgreSQL
rds.force_ssl=1 pour que le serveur rejette les connexions en texte brut. La version du moteur est épinglée une fois car la famille du groupe de paramètres doit correspondre à la version majeure du moteur que l’instance exécute :--master-user-password est visible dans la table des processus et dans les journaux d’audit/EDR pendant l’exécution de la commande, la même exposition que celle couverte par la note de l’étape des secrets. Sur un hôte partagé ou surveillé, passez le mot de passe via --cli-input-json à partir d’un fichier 0600 à la place, de la même façon que le setup.sh du bundle.Attendez que l’instance soit opérationnelle, ce qui peut prendre plusieurs minutes, puis lisez son point de terminaison privé et assemblez la chaîne de connexion que la passerelle utilisera :sslmode=verify-full fait que la passerelle vérifie la chaîne du certificat du serveur RDS et le nom d’hôte, pas seulement le chiffrement. L’ancre de confiance est le bundle de certificats AWS RDS, que l’étape de construction d’image ci-dessous copie à /etc/claude/rds-global-bundle.pem et approuve via NODE_EXTRA_CA_CERTS. N’ajoutez pas de paramètre sslrootcert= de style libpq à l’URL : le pilote de la passerelle lit uniquement sslmode à partir de la chaîne de requête et transmettrait sslrootcert à Postgres en tant que paramètre de démarrage, que le serveur rejette.Le service ECS ou les pods EKS doivent s’exécuter dans ce VPC pour pouvoir atteindre le point de terminaison privé de l’instance, et le groupe de sécurité claude-gateway-db n’admet que le groupe de sécurité de la passerelle.Écrire gateway.yaml
upstreams pointe vers Bedrock avec auth: {}, donc la passerelle s’authentifie via la chaîne de credentials par défaut d’AWS à partir du rôle de tâche sur ECS ou du rôle IRSA sur EKS. Consultez la référence de configuration pour chaque champ.Deux champs listen dépendent de ce qui est en face de la passerelle :public_url: l’originehttps://externe, requise pour tout bind non-loopback ; consultez la référencelisten. La passerelle construit l’redirect_uride l’IdP et son document de découverte uniquement à partir de cette valeur, jamais à partir des en-têtesX-Forwarded-*.trusted_proxies: les plages source du frontal. La passerelle honoreX-Forwarded-Foruniquement lorsque le pair TCP est dans cette liste, puis parcourt la chaîne au-delà des sauts de confiance, donc les limites de taux de connexion par IP et les événements d’audit enregistrent les adresses IP des développeurs au lieu de celle de l’équilibreur de charge.
trusted_proxies sur les CIDR de ces sous-réseaux. Cela approuve chaque hôte de ces sous-réseaux en tant que proxy. Gardez la source d’entrée de l’ALB, votre CIDR d’entreprise, de ne pas chevaucher, et ne partagez pas les sous-réseaux avec des charges de travail non fiables qui pourraient usurper les adresses IP des clients via X-Forwarded-For.L’attribut de préservation du port client de l’ALB, routing.http.xff_client_port.enabled, peut rester à l’un ou l’autre paramètre : avec lui activé, l’ALB écrit le client comme 203.0.113.7:54321 ou [2001:db8::1]:54321, et la passerelle lit les deux avec le port supprimé.oidc est spécifique à Okta. Pour utiliser Microsoft Entra ID à la place, définissez issuer sur https://login.microsoftonline.com/<tenant-id>/v2.0, supprimez userinfo_fallback et la portée groups, et notez qu’Entra émet des ID d’objet de groupe plutôt que des noms, donc managed.policies doit correspondre sur les GUID, ou sur les rôles d’application avec oidc.groups_claim: roles. Consultez Configuration du fournisseur d’identité.Stocker les secrets dans AWS Secrets Manager
--secret-string sont visibles dans la table des processus et dans les journaux d’audit/EDR pendant l’exécution de chaque commande. Sur un hôte partagé ou surveillé, mettez la valeur dans un fichier 0600 et passez --secret-string file://<path> à la place. Le setup.sh du bundle garde les valeurs secrètes hors de l’argv du processus de la même façon, en passant des fichiers temporaires 0600 à --cli-input-json.gateway.yaml lui-même ne contient aucune valeur secrète, car chaque credential se résout au démarrage via l’expansion ${VAR} ou ${file:...}. La façon dont tout atteint le conteneur diffère selon la piste :- Sur ECS, l’étape de construction suivante copie
gateway.yamldans l’image à/etc/claude/gateway.yaml, et la définition de tâche injecte les trois secrets en tant que variables d’environnement via son champsecrets, donc le YAML référence${GATEWAY_JWT_SECRET},${OIDC_CLIENT_SECRET}et${GATEWAY_POSTGRES_URL}. - Sur EKS, montez
gateway.yamlà partir d’une ConfigMap et les secrets en tant que fichiers à/secrets, référencés comme${file:/secrets/...}. Sourcez les secrets Kubernetes à partir de Secrets Manager avec External Secrets Operator ou le pilote AWS du pilote CSI Secrets Store, ou créez-les directement aveckubectl.
Construire et pousser l'image vers Amazon ECR
linux-x64 à ./claude dans le contexte de construction. Écrivez votre propre Dockerfile selon ces exigences ou commencez par le Dockerfile du bundle, qui copie le gateway.yaml rempli des étapes précédentes dans l’image à /etc/claude/gateway.yaml. Sur ECS, cette copie intégrée est la façon dont la configuration atteint le conteneur, c’est pourquoi la construction vient après l’écriture du fichier. La piste EKS monte plutôt gateway.yaml à partir d’une ConfigMap au déploiement, donc la copie intégrée n’est pas utilisée là.L’image porte également le bundle de certificats AWS RDS comme ancre de confiance pour la chaîne de connexion sslmode=verify-full, donc téléchargez-le d’abord dans le contexte de construction. AWS fait tourner le bundle (les nouvelles autorités de certification régionales sont ajoutées), donc téléchargez-le par construction plutôt que d’épingler une somme de contrôle ou de le valider :<version> que l’étape de déploiement épingle ne peut pas être ultérieurement silencieusement réorientée vers une image différente :linux/amd64, donc la plateforme doit correspondre ici ; pour Fargate sur ARM64 (Graviton), construisez linux/arm64 avec le binaire linux-arm64 et définissez cpuArchitecture sur ARM64 à la place :Déployer
- ECS Fargate
- EKS
--ip-address-type ipv4 est important : un ALB interne double pile publie des enregistrements AAAA de plage publique, que la vérification de réseau privé /login rejette :--ssl-policy épingle un plancher TLS moderne, car l’omettre revient à la politique par défaut héritée ELBSecurityPolicy-2016-08, qui accepte toujours TLS 1.0/1.1.L’ALB ferme une connexion après 60 secondes sans données par défaut. Les pings de maintien de la passerelle gardent les flux à l’intérieur de ce délai par défaut, donc augmenter le délai d’inactivité ajoute une marge au-dessus de la cadence de ping ; la ligne Dépannage sur les flux abandonnés couvre le mécanisme et les passerelles plus anciennes. Les commandes ci-dessous ajoutent l’écouteur et augmentent le délai d’inactivité :GET /readyz vérifie que le store est accessible, donc une tâche qui ne peut pas atteindre Postgres n’entre jamais en rotation ; consultez Comportement en cas de panne pour le compromis et l’alternative /healthz.Les tâches s’exécutent dans des sous-réseaux privés sans IP publique, donc tout le trafic sortant (vers Bedrock, votre IdP, Secrets Manager, ECR et CloudWatch Logs) passe par la passerelle NAT. Pour garder le trafic Bedrock hors du chemin public, créez un point de terminaison VPC d’interface bedrock-runtime et pointez l’base_url upstream vers celui-ci, comme indiqué dans la référence upstream Bedrock ; l’IdP a toujours besoin d’une sortie Internet.Terminez en donnant aux développeurs un nom d’hôte privé résolvable : dans une zone hébergée privée Route 53, aliasez le nom DNS interne de la passerelle à l’ALB, et définissez listen.public_url sur ce nom d’hôte. Le nom *.elb.amazonaws.com propre de l’ALB se résout en adresses privées sur un ALB interne, mais il ne peut pas porter votre certificat ACM, donc utilisez votre propre nom.Mettez à jour l’URI de redirection autorisée du client OAuth vers <public_url>/oauth/callback avant la première connexion. Après avoir modifié public_url, reconstruisez et poussez l’image sous une nouvelle balise, enregistrez une nouvelle révision de définition de tâche et redéployez. Sur ECS, le paramètre vit dans le gateway.yaml intégré de l’image, et la passerelle construit son origine publique uniquement à partir de ce paramètre, en ignorant X-Forwarded-Host et X-Forwarded-Proto. X-Forwarded-For est honoré pour les adresses IP des clients uniquement lorsque listen.trusted_proxies est défini.Pousser l'URL de la passerelle vers les machines des développeurs
/login jusqu’à ce que l’URL de la passerelle soit sur leurs machines. Définissez forceLoginMethod et forceLoginGatewayUrl dans le fichier de paramètres gérés que vous déployez sur chaque appareil via MDM. Il n’y a pas d’option de passerelle dans le sélecteur de connexion pour qu’un développeur sélectionne manuellement.Référence Terraform
Le bundle compagnon àexamples/gateway/aws empaquette cette page en tant que code :
setup.shscript la procédure pas à pas de provisionnement ci-dessus avec les mêmes commandesaws, sur la piste ECS Fargate. Il est idempotent : les ressources existantes sont détectées et ignorées, donc le réexécuter est sûr, et tout défaut peut être remplacé via une variable d’environnement. Vous créez toujours le secret client OIDC Okta et le certificat ACM vous-même : une exécution sans eux ignore le déploiement ECS/ALB, nomme les entrées manquantes et imprime la commandecreate-secret; créez les deux et réexécutez. Le formulaire de cas d’usage Bedrock et l’alias Route 53 s’impriment comme les prochaines étapes plutôt que de s’exécuter automatiquement, et la poussée MDM du client reste une étape manuelle de cette page.gateway.yaml.exampleest le modèle de configuration de l’étape gateway.yaml, avec les clés optionnelles incluses commentées. Copiez-le versgateway.yamlet remplacez chaqueREPLACE_MEavant de construire.Dockerfileconstruit l’image d’exécution à partir du binaire précompilélinux-x64et copie votregateway.yamlrempli à/etc/claude/gateway.yaml, plus le bundle de certificats AWS RDS qui ancre lesslmode=verify-fulldu store.setup.shtélécharge le bundle uniquement lorsqu’il n’est pas déjà dans le contexte de construction ; supprimez le fichier et reconstruisez sous une nouvelle balise pour récupérer une rotation d’autorité de certification AWS. Le fichier de configuration ne contient aucune valeur secrète, car chaque credential se résout au démarrage via l’expansion${VAR}. Une modification de configuration signifie donc une reconstruction sous une nouvelle balise ;setup.shautomatise cela en marquant les images avec un hash du fichier.terraform/provisionne la même portée ECS Fargate de manière déclarative : les groupes de sécurité, les rôles IAM, le référentiel ECR, l’instance RDS, les secrets Secrets Manager et le service ECS derrière l’ALB interne. Le VPC et les sous-réseaux privés restent des prérequis, transmis en tant que variables. Terraform crée le référentiel ECR mais ne construit pas l’image, et la définition de service référence l’image, donc l’application est deux passes : une application ciblée pour le référentiel, puis la construction et la poussée, puis l’application complète. Leterraform/README.mddu bundle couvre les variables, l’état distant et le démontage.
Dépannage
Pour les erreurs de démarrage et de connexion de la passerelle, consultez le tableau de dépannage indépendant de la plateforme. Les entrées ci-dessous sont spécifiques à AWS.Télémétrie
La passerelle vous donne des métriques d’utilisation par développeur sans aucune configuration OTEL par machine. Claude Code émet des métriques, des journaux et des traces OpenTelemetry (OTLP) optionnels ; Surveillance de l’utilisation couvre tout ce que le CLI rapporte. Sur les sessions de passerelle, le CLI marque chaque export avec les attributs d’identité IdP authentifiésuser.id, user.email et user.groups, donc l’utilisation s’accumule par développeur sans plomberie OTEL_RESOURCE_ATTRIBUTES.
La passerelle elle-même est un relais OTLP authentifié. Définissez telemetry.forward_to avec listen.public_url, et elle pousse les paramètres d’exportateur OTEL à chaque client connecté et transfère leur trafic OTLP verbatim à chaque destination que vous listez. Chaque destination opte pour les métriques, les journaux et les traces indépendamment, et la valeur par défaut est les métriques uniquement ; consultez la référence telemetry pour les champs par signal et leurs compromis de sensibilité. La passerelle ne met pas en mémoire tampon, n’agrège pas ou ne stocke pas la télémétrie, donc l’endroit où les données arrivent est entièrement la configuration d’exportateur du collecteur.
La télémétrie du client est désactivée par défaut ; configurer telemetry.forward_to est ce qui l’active pour les développeurs connectés, et chaque client interactif affiche une boîte de dialogue d’approbation de sécurité unique pour les paramètres poussés, comme décrit dans la référence de configuration. Sur AWS, chaque signal mappe à une destination comme suit.
Métriques, journaux et traces du client
Pointeztelemetry.forward_to vers un collecteur OpenTelemetry, tel que le collecteur AWS Distro for OpenTelemetry (ADOT), et exportez de là vers Amazon CloudWatch, Amazon Managed Service for Prometheus ou tout backend OTLP.
Exécutez le collecteur en tant que service interne séparé accessible via https:// ; la référence telemetry couvre l’exception de loopback et CLAUDE_GATEWAY_ALLOW_LOOPBACK.
Journaux de la passerelle
Sur ECS Fargate, aucune configuration supplémentaire : le piloteawslogs livre la sortie d’erreur standard de la passerelle, qui porte ses événements d’audit et ses journaux opérationnels, au groupe de journaux /ecs/claude-gateway créé ci-dessus. Sur EKS, les journaux des pods n’arrivent pas à CloudWatch par défaut, donc la piste d’audit est perdue jusqu’à ce que vous installiez la collecte de journaux : le module complémentaire Amazon CloudWatch Observability avec capture de journaux de conteneur activée, ou un DaemonSet Fluent Bit. Sur l’une ou l’autre piste, interrogez les journaux avec CloudWatch Logs Insights et pilotez les alarmes à partir des filtres de métriques.
Métriques de conteneur
Activez Container Insights sur le cluster avecaws ecs update-cluster-settings --cluster claude-gateway --settings name=containerInsights,value=enabled pour le CPU, la mémoire et le réseau par tâche. Sur EKS, installez le module complémentaire Amazon CloudWatch Observability.
Dépenses
La télémétrie affiche l’utilisation après le fait ; les limites de dépenses sont la vue en direct de la passerelle et l’application par développeur en plus de la credential upstream partagée.Prochaines étapes
- Référence de configuration : chaque option
gateway.yaml, y comprismanaged.policiesettelemetry - Déploiement et opérations : configuration IdP, vérifications de santé, rotation de clé JWT secrète, mises à niveau et modèle de sécurité
- Aperçu de la passerelle Claude apps : démarrage rapide et connexion des développeurs
- Exemples AWS pour la passerelle Claude apps : exemples de déploiement maintenus par AWS couvrant une gamme d’environnements clients