For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale

Configuration de la fédération d’identités de charge de travail pour AWS

Utilisez AWS comme fournisseur d’identités de charge de travail dans l’un des scénarios suivants :

  • Fédération d’identités sortante AWS : échangez un JWT OIDC émis par AWS STS via GetWebIdentityToken contre un jeton d’accès OpenAI à courte durée de vie.
  • Amazon EKS : échangez un jeton de compte de service projeté Amazon EKS contre un jeton d’accès OpenAI à courte durée de vie.

Pour Codex, suivez les instructions de cette page afin d’obtenir et d’inspecter le jeton AWS. Ensuite, configurez l’identité de charge de travail Codex pour écrire ce jeton dans un fichier et indiquer ce fichier à Codex. La correspondance de compte de service et les exemples de SDK présentés sur cette page s’appliquent à l’API OpenAI.

OpenAI prend en charge les JWT OIDC émis par AWS via la fédération d’identités sortante et les jetons de compte de service projetés Kubernetes émis par Amazon EKS. OpenAI ne prend pas en charge les requêtes signées avec SigV4 ni les identifiants de clé d’accès temporaires AWS STS comme jetons de sujet pour la fédération d’identités de charge de travail.

Fédération d’identités sortante AWS

La fédération d’identités sortante AWS permet à un principal AWS de demander un JWT OIDC signé à AWS STS et de le présenter à un service externe. Dans la fédération d’identités de charge de travail OpenAI, le JWT émis par AWS est le jeton de sujet qu’OpenAI valide avant d’émettre un jeton d’accès OpenAI.

Configuration de la fédération d’identités sortante AWS

Activez la fédération d’identités sortante pour le compte AWS qui émettra les jetons. Pour en savoir plus sur la configuration, consultez le guide AWS pour bien démarrer avec la fédération d’identités sortante.

aws iam enable-outbound-web-identity-federation

Notez l’URL de l’émetteur propre au compte renvoyée par AWS. Vous utiliserez cette valeur pour configurer l’émetteur du fournisseur d’identités de charge de travail dans OpenAI. Elle doit correspondre à la revendication iss des jetons émis par AWS.

L’API GetWebIdentityToken d’AWS STS n’est pas disponible sur le point de terminaison global STS. Configurez la CLI ou le SDK AWS pour utiliser un point de terminaison régional STS.

Accordez à la charge de travail l’autorisation d’appeler sts:GetWebIdentityToken. Limitez l’audience et la durée de vie maximale des jetons dans IAM afin que le principal AWS ne puisse émettre que des jetons destinés à OpenAI. Cet exemple autorise les jetons pour l’audience https://api.openai.com/v1 avec une durée de vie maximale de 300 secondes :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetWebIdentityToken",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "sts:IdentityTokenAudience": "https://api.openai.com/v1"
        },
        "NumericLessThanEquals": {
          "sts:DurationSeconds": 300
        }
      }
    }
  ]
}

Demandez un jeton OIDC émis par AWS avec la même audience que celle que vous configurerez sur le fournisseur d’identités de charge de travail dans OpenAI. Utilisez ES384, sauf si votre environnement exige la compatibilité avec RS256.

TOKEN=$(aws sts get-web-identity-token \
  --audience "https://api.openai.com/v1" \
  --signing-algorithm ES384 \
  --duration-seconds 300 \
  --tags Key=environment,Value=production \
         Key=workload,Value=batch-ingest \
  --query "WebIdentityToken" \
  --output text)
export TOKEN

Vérifiez le jeton émis par AWS

Avant de configurer la fédération d’identités de charge de travail, exportez le jeton émis par AWS dans la variable TOKEN, puis exécutez ce script localement pour inspecter ses revendications :

const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}
if (!/^[A-Za-z0-9_-]+$/.test(parts[1]) || parts[1].length % 4 === 1) {
  throw new Error("JWT payload is not valid Base64URL");
}

const bytes = Buffer.from(parts[1], "base64url");
if (bytes.toString("base64url") !== parts[1]) {
  throw new Error("JWT payload is not valid Base64URL");
}
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
const claims = JSON.parse(decoded);
if (claims === null || Array.isArray(claims) || typeof claims !== "object") {
  throw new Error("JWT payload is not a JSON object");
}
console.log(decoded);

Cette commande décode la charge utile du JWT sans vérifier la signature du jeton. Utilisez un décodeur local pour les jetons de production et évitez de les coller dans des outils tiers.

Un jeton OIDC émis par AWS, une fois décodé, ressemble à ceci :

{
  "iss": "https://abc123-def456-ghi789-jkl012.tokens.sts.global.api.aws",
  "aud": "https://api.openai.com/v1",
  "sub": "arn:aws:iam::123456789012:role/OpenAIWifRole",
  "iat": 1716235422,
  "exp": 1716235722,
  "jti": "jwt-id-example",
  "https://sts.amazonaws.com/": {
    "aws_account": "123456789012",
    "source_region": "us-west-2",
    "org_id": "o-exampleorgid",
    "principal_tags": {
      "environment": "production"
    },
    "request_tags": {
      "environment": "production",
      "workload": "batch-ingest"
    }
  }
}

Les jetons émis par AWS ne contiennent pas tous l’ensemble des revendications propres à AWS. Les revendications sous https://sts.amazonaws.com/ dépendent du principal appelant, du contexte de session et des balises de requête.

Vérifiez les revendications que vous prévoyez de configurer dans OpenAI :

  • iss : doit correspondre à l’URL de l’émetteur propre au compte AWS configurée dans le fournisseur d’identités de charge de travail dans OpenAI.
  • aud : doit correspondre à l’audience de GetWebIdentityToken et à celle du fournisseur d’identités de charge de travail dans OpenAI.
  • sub : identifie l’ARN du principal IAM qui a demandé le jeton. Privilégiez une correspondance exacte avec l’ARN du rôle.
  • Revendications propres à AWS : utilisez le jeton décodé comme référence avant de définir des correspondances sur les valeurs de compte, d’organisation, de balise de principal ou de balise de requête.

Utilisez la charge utile décodée pour comparer le jeton reçu aux valeurs d’émetteur, d’audience et de correspondance configurées dans OpenAI. La plupart des problèmes de configuration sont visibles dans les revendications iss, aud et sub avant l’échange du jeton.

Configuration de la fédération d’identités de charge de travail

Créez un fournisseur d’identités de charge de travail dans OpenAI pour l’émetteur du compte AWS, puis ajoutez une correspondance de compte de service basée sur des revendications stables du jeton émis par AWS.

Configurez d’abord le fournisseur d’identités de charge de travail, puis créez la correspondance de compte de service.

Configurez le fournisseur d’identités de charge de travail

  1. Créez le fournisseur d’identités de charge de travail. Renseignez le champ Nom avec une valeur unique, telle que aws-outbound-prod. Renseignez le champ Description, par exemple avec Production AWS outbound identity federation workloads, pour aider les administrateurs à identifier le fournisseur.

  2. Définissez l’émetteur et l’audience. Renseignez le champ URL de l’émetteur OIDC avec l’URL de l’émetteur propre au compte AWS renvoyée lors de l’activation de la fédération d’identités sortante. Cette valeur doit correspondre à la revendication iss du jeton. Renseignez le champ Audience avec la même audience que celle transmise à GetWebIdentityToken. Dans cet exemple, cette valeur est https://api.openai.com/v1.

  3. Utilisez la découverte OIDC AWS. Laissez l’option Utiliser le JWKS importé pour vérifier les jetons désactivée. OpenAI utilise les métadonnées de découverte OIDC et le JWKS de l’émetteur AWS pour vérifier le jeton émis par AWS.

  4. Ajoutez des transformations d’attributs uniquement si vous avez besoin d’attributs dérivés pour les correspondances. La mise en correspondance directe des jetons prend en charge les revendications scalaires de premier niveau, telles que sub, aud et iss. Les revendications propres à AWS, regroupées dans un espace de noms, sont imbriquées sous https://sts.amazonaws.com/. Créez donc des attributs dérivés avec la notation entre crochets de CEL avant de les utiliser dans les correspondances. Par exemple, saisissez aws_environment avec l’expression assertion["https://sts.amazonaws.com/"]["principal_tags"]["environment"] pour créer openai.aws_environment à partir de l’exemple de jeton décodé ci-dessus. Vérifiez le chemin de la revendication imbriquée dans un exemple de jeton avant de l’utiliser ; si une transformation ne peut pas être évaluée, la résolution de la correspondance échoue. Les revendications brutes du jeton dont le nom commence déjà par openai. sont ignorées pour les clés de correspondance openai., sauf si une transformation correspondante est configurée.

Configurez la correspondance de compte de service

  1. Créez une correspondance de compte de service. Renseignez le champ Nom avec une valeur unique au sein du fournisseur d’identités de charge de travail, telle que aws-role-openai-wif. Renseignez le champ Description, par exemple avec Production AWS role for OpenAI API workload, pour indiquer quelle charge de travail peut utiliser cette correspondance.

  2. Définissez une correspondance pour le principal AWS. Renseignez le champ Clé avec sub et le champ Valeur avec l’ARN du principal IAM présent dans le jeton décodé, tel que arn:aws:iam::123456789012:role/OpenAIWifRole. Une correspondance exacte sur la revendication sub offre l’isolation la plus forte pour la fédération d’identités sortante AWS.

  3. Ajoutez des critères de correspondance sur d’autres revendications si nécessaire. Vous pouvez définir une correspondance sur n’importe quelle revendication scalaire ou n’importe quel attribut transformé disponible. Par exemple, utilisez des attributs transformés dérivés des revendications de compte AWS, d’organisation, de balise de principal ou de balise de requête si vous avez besoin de délimiter davantage le périmètre de confiance.

  4. Choisissez la cible OpenAI. Dans le champ Projet , sélectionnez le projet OpenAI auquel appartient le compte de service cible. Dans le champ Compte de service , sélectionnez le compte de service OpenAI que la charge de travail AWS peut utiliser, tel que aws-outbound-prod-openai-wif.

  5. Restreignez les autorisations de l’API si nécessaire. Sélectionnez les Autorisations appropriées, telles que api.model.request et api.vector_store.read, pour restreindre davantage les droits des jetons d’accès émis à partir de cette correspondance. Laissez ce champ vide pour ne pas ajouter de restriction de portée propre à WIF ; le jeton continue d’autoriser l’accès au nom du compte de service associé.

Utilisation du jeton dans le code

Configurez votre client du SDK OpenAI pour demander un jeton OIDC émis par AWS à AWS STS et l’échanger contre un jeton d’accès émis par OpenAI.

Définissez OPENAI_WIF_AUDIENCE sur la même audience que celle configurée sur le fournisseur d’identités de charge de travail dans OpenAI. Le fournisseur de jetons de sujet appelle GetWebIdentityToken d’AWS STS avec cette audience et renvoie le JWT émis par AWS comme jeton de sujet. Le SDK OpenAI l’échange ensuite contre un jeton d’accès émis par OpenAI.

Authentification à partir d’un jeton OIDC émis par AWS
import { GetWebIdentityTokenCommand, STSClient } from "@aws-sdk/client-sts";
import OpenAI from "openai";

const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;
const audience = process.env.OPENAI_WIF_AUDIENCE;
const awsRegion = process.env.AWS_REGION;

if (!identityProviderId || !serviceAccountId || !audience || !awsRegion) {
  throw new Error(
    "Set OPENAI_IDENTITY_PROVIDER_ID, OPENAI_SERVICE_ACCOUNT_ID, OPENAI_WIF_AUDIENCE, and AWS_REGION"
  );
}
const wifAudience = audience;

const sts = new STSClient({ region: awsRegion });

function awsOutboundWebIdentityTokenProvider() {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const response = await sts.send(
        new GetWebIdentityTokenCommand({
          Audience: [wifAudience],
          SigningAlgorithm: "ES384",
          DurationSeconds: 300,
        })
      );

      if (!response.WebIdentityToken) {
        throw new Error("AWS STS did not return a web identity token.");
      }

      return response.WebIdentityToken;
    },
  };
}

const client = new OpenAI({
  workloadIdentity: {
    identityProviderId,
    serviceAccountId,
    provider: awsOutboundWebIdentityTokenProvider(),
  },
});

const response = await client.responses.create({
  model: "gpt-5.6-terra",
  input: "Say hello from AWS outbound workload identity federation.",
});

console.log(response.output_text);

Bonnes pratiques AWS

  • Utilisez une identité AWS dédiée par charge de travail. Utilisez des rôles IAM distincts pour la fédération d’identités sortante AWS et des comptes de service Kubernetes distincts pour les charges de travail EKS.
  • Configurez une audience dédiée à l’accès à OpenAI. Utilisez la même valeur d’audience dans le token émis par AWS ou projeté par EKS et dans la configuration du fournisseur d’identités de charge de travail OpenAI.
  • Gardez des durées de validité des tokens raisonnablement courtes. Pour la fédération d’identités sortante AWS, utilisez des conditions IAM telles que sts:DurationSeconds ; pour EKS, définissez un délai d’expiration approprié pour le token projeté.
  • Privilégiez une correspondance exacte avec le sujet. Définissez la correspondance sur l’ARN complet du principal IAM pour les tokens de fédération sortante AWS, ou sur le sujet complet du compte de service Kubernetes pour les tokens EKS.
  • Limitez la portée des mappages à des périmètres stables. Utilisez le compte, l’organisation, l’espace de noms ou des attributs transformés lorsqu’ils permettent de restreindre l’accès sans créer de règles de confiance trop larges.
  • Rechargez les tokens lors de leur échange. Demandez les tokens de fédération sortante AWS au moment où vous en avez besoin et lisez les tokens projetés EKS depuis le chemin du fichier monté afin de prendre automatiquement en compte leur rotation.
  • Accordez uniquement les autorisations requises par la charge de travail. Utilisez les autorisations définies au niveau du mappage pour restreindre davantage l’accès accordé par le compte de service OpenAI cible.