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

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

Vous pouvez utiliser AWS comme fournisseur d’identités de charge de travail dans deux cas :

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

OpenAI accepte les JWT OIDC émis par AWS dans le cadre de la fédération d’identités sortante ainsi que les jetons projetés de comptes de service Kubernetes émis par Amazon EKS. Les requêtes signées avec SigV4 et les informations d’identification temporaires par clé d’accès d’AWS STS ne peuvent pas servir de jetons de sujet pour la fédération d’identités de charge de travail avec OpenAI.

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

La fédération d’identités sortante d’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 d’OpenAI, le JWT émis par AWS sert de jeton de sujet. OpenAI le valide avant d’émettre un jeton d’accès OpenAI.

Configuration de la fédération d’identités sortante d’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 de prise en main de la fédération d’identités sortante d’AWS.

aws iam enable-outbound-web-identity-federation

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

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

Autorisez la charge de travail à appeler sts:GetWebIdentityToken. Dans IAM, limitez l’audience et la durée de validité maximale des jetons pour que le principal AWS puisse uniquement générer des jetons destinés à OpenAI. Dans cet exemple, la politique autorise les jetons dont l’audience est https://api.openai.com/v1 et dont la durée de validité ne dépasse pas 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 à AWS un jeton OIDC en spécifiant l’audience que vous configurerez pour 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érification du 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 examiner 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 sa signature. Pour les jetons de production, utilisez un décodeur local et évitez de les coller dans des outils tiers.

Voici un exemple de jeton OIDC émis par AWS après décodage :

{
  "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 systématiquement toutes les revendications propres à AWS. Les revendications regroupées sous https://sts.amazonaws.com/ dépendent du principal qui effectue l’appel, du contexte de la session et des balises de la requête.

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

  • iss : sa valeur doit correspondre à l’URL de l’émetteur propre au compte AWS que vous avez configurée pour le fournisseur d’identités de charge de travail dans OpenAI.
  • aud : sa valeur doit correspondre à l’audience transmise à GetWebIdentityToken et à celle du fournisseur d’identités de charge de travail dans OpenAI.
  • sub : sa valeur est l’ARN du principal IAM qui a demandé le jeton. Privilégiez une correspondance exacte avec l’ARN du rôle.
  • Revendications propres à AWS : prenez le jeton décodé comme référence pour définir les correspondances portant sur le compte, l’organisation, les balises du principal ou celles de la requête.

À partir de la charge utile décodée, comparez les valeurs du jeton reçu à celles de l’émetteur, de l’audience et de la correspondance configurées dans OpenAI. L’examen des revendications iss, aud et sub permet de repérer la plupart des problèmes de configuration avant d’échanger le jeton.

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

Dans OpenAI, créez un fournisseur d’identités de charge de travail pour l’émetteur du compte AWS, puis ajoutez une correspondance de compte de service fondé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.

Configuration du fournisseur d’identités de charge de travail

  1. Créez le fournisseur d’identités de charge de travail. Dans Nom, saisissez une valeur unique, par exemple aws-outbound-prod. Dans Description, saisissez un texte qui aidera les administrateurs à identifier le fournisseur, par exemple Production AWS outbound identity federation workloads.

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

  3. Utilisez la découverte OIDC d’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 vos correspondances nécessitent des attributs dérivés. Vous pouvez définir une correspondance directement à partir des revendications scalaires de premier niveau du jeton, comme sub, aud et iss. Les revendications de l’espace de noms AWS sont imbriquées sous https://sts.amazonaws.com/. Pour les utiliser dans des correspondances, créez d’abord des attributs dérivés avec la notation entre crochets de CEL. Par exemple, saisissez aws_environment comme nom et assertion["https://sts.amazonaws.com/"]["principal_tags"]["environment"] comme expression pour créer openai.aws_environment à partir du jeton décodé ci-dessus. Vérifiez le chemin de la revendication imbriquée dans un exemple de jeton avant de l’utiliser. Si OpenAI ne peut pas évaluer une transformation, il ne peut pas résoudre la correspondance. Si le nom d’une revendication brute du jeton commence déjà par openai., OpenAI l’ignore pour les clés de correspondance qui commencent par openai., sauf si vous configurez une transformation correspondante.

Configuration de la correspondance de compte de service

  1. Créez une correspondance de compte de service. Dans Nom, saisissez une valeur unique au sein du fournisseur d’identités de charge de travail, par exemple aws-role-openai-wif. Dans Description, indiquez quelle charge de travail peut utiliser cette correspondance, par exemple Production AWS role for OpenAI API workload.

  2. Définissez une correspondance avec le principal AWS. Dans Clé, saisissez sub. Dans Valeur, saisissez l’ARN du principal IAM figurant dans le jeton décodé, par exemple arn:aws:iam::123456789012:role/OpenAIWifRole. Une correspondance exacte avec la valeur de sub offre le niveau d’isolation le plus élevé pour la fédération d’identités sortante d’AWS.

  3. Ajoutez d’autres critères de correspondance si nécessaire. Vous pouvez utiliser toute revendication scalaire ou tout attribut transformé disponible. Par exemple, si vous devez restreindre davantage le périmètre de confiance, utilisez des attributs dérivés des revendications AWS relatives au compte, à l’organisation, aux balises du principal ou à celles de la requête.

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

  5. Limitez les autorisations d’accès à l’API si nécessaire. Sous Autorisations, sélectionnez les autorisations appropriées, par exemple api.model.request et api.vector_store.read, pour restreindre davantage les droits associés aux jetons d’accès émis à partir de cette correspondance. Laissez ce champ vide si vous ne souhaitez pas ajouter de restriction de portée propre à la fédération d’identités de charge de travail. Le jeton permet toujours d’agir avec les droits du compte de service associé.

Utilisation du jeton dans le code

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

Définissez OPENAI_WIF_AUDIENCE sur la même audience que celle configurée pour le fournisseur d’identités de charge de travail dans OpenAI. Le fournisseur de jetons de sujet appelle l’API 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 avec 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 pour AWS

  • Utilisez une identité AWS dédiée à chaque charge de travail. Attribuez des rôles IAM distincts aux charges de travail qui utilisent la fédération d’identités sortante d’AWS et des comptes de service Kubernetes distincts aux charges de travail EKS.
  • Configurez une audience dédiée à l’accès à OpenAI. Utilisez la même valeur d’audience pour le jeton émis par AWS ou projeté par EKS et pour le fournisseur d’identités de charge de travail dans OpenAI.
  • Limitez la durée de validité des jetons. Pour la fédération d’identités sortante d’AWS, utilisez des conditions IAM telles que sts:DurationSeconds. Pour EKS, définissez une durée de validité adaptée au jeton projeté.
  • Privilégiez une correspondance exacte avec le sujet. Utilisez l’ARN complet du principal IAM pour les jetons issus de la fédération sortante d’AWS ou le sujet complet du compte de service Kubernetes pour les jetons EKS.
  • Délimitez les correspondances à l’aide de critères stables. Utilisez le compte, l’organisation, l’espace de noms ou des attributs transformés lorsque ces critères permettent de restreindre l’accès sans créer de règles de confiance trop larges.
  • Rechargez les jetons à chaque échange. Demandez les jetons issus de la fédération sortante d’AWS au moment où vous en avez besoin. Pour les jetons projetés par EKS, lisez le fichier monté afin d’utiliser automatiquement les nouveaux jetons après leur rotation.
  • Accordez uniquement les autorisations nécessaires à la charge de travail. Utilisez les autorisations de la correspondance pour restreindre davantage l’accès accordé par le compte de service OpenAI cible.