For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Configurar la federación de identidades de cargas de trabajo para AWS

Puedes usar AWS como proveedor de identidades de cargas de trabajo en cualquiera de estos casos:

  • Federación de identidades saliente de AWS: intercambia un JWT de OIDC emitido por AWS STS mediante GetWebIdentityToken por un token de acceso de OpenAI de corta duración.
  • Amazon EKS: intercambia un token proyectado de una cuenta de servicio de Amazon EKS por un token de acceso de OpenAI de corta duración.

OpenAI admite los JWT de OIDC que emite AWS mediante la federación de identidades saliente y los tokens proyectados de cuentas de servicio de Kubernetes que emite Amazon EKS. OpenAI no admite solicitudes firmadas con SigV4 ni credenciales temporales de clave de acceso de AWS STS como tokens de sujeto para la federación de identidades de cargas de trabajo.

Federación de identidades saliente de AWS

La federación de identidades saliente de AWS permite que una entidad principal de AWS solicite a AWS STS un JWT de OIDC firmado y lo presente a un servicio externo. En la federación de identidades de cargas de trabajo de OpenAI, el JWT que emite AWS es el token de sujeto que OpenAI valida antes de emitir un token de acceso de OpenAI.

Configurar la federación de identidades saliente de AWS

Habilita la federación de identidades saliente en la cuenta de AWS que emitirá los tokens. Para obtener más detalles sobre la configuración, consulta la guía de AWS sobre cómo empezar a usar la federación de identidades saliente.

aws iam enable-outbound-web-identity-federation

Anota la URL del emisor que AWS devuelve para esa cuenta. Configurarás este valor como emisor del proveedor de identidades de cargas de trabajo de OpenAI. Debe coincidir con la declaración iss de los tokens que emite AWS.

La API GetWebIdentityToken de AWS STS no está disponible en el punto de acceso global de STS. Configura la CLI o el SDK de AWS para que use un punto de acceso regional de STS.

Otorga a la carga de trabajo permiso para llamar a sts:GetWebIdentityToken. Restringe la audiencia y la duración máxima del token en IAM para que la entidad principal de AWS solo pueda generar tokens destinados a OpenAI. Este ejemplo permite generar tokens para la audiencia https://api.openai.com/v1 con una duración máxima de 300 segundos:

{
  "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
        }
      }
    }
  ]
}

Solicita a AWS un token de OIDC con la misma audiencia que configurarás en el proveedor de identidades de cargas de trabajo de OpenAI. Usa ES384, a menos que tu entorno requiera compatibilidad con 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

Verificar el token emitido por AWS

Antes de configurar la federación de identidades de cargas de trabajo, exporta el token emitido por AWS como TOKEN. Luego ejecuta este script localmente para revisar sus declaraciones:

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);

Este comando decodifica la carga útil del JWT sin verificar la firma del token. Usa un decodificador local para los tokens de producción y evita pegarlos en herramientas de terceros.

Una vez decodificada, la carga útil de un token de OIDC emitido por AWS tendrá un aspecto similar al de este ejemplo:

{
  "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"
    }
  }
}

Los tokens que emite AWS no siempre incluyen todas las declaraciones específicas de AWS. Las declaraciones que aparecen bajo https://sts.amazonaws.com/ dependen de la entidad principal que hace la llamada, del contexto de la sesión y de las etiquetas de la solicitud.

Verifica las declaraciones que vas a configurar en OpenAI:

  • iss: debe coincidir con la URL del emisor de la cuenta de AWS que configuraste en el proveedor de identidades de cargas de trabajo de OpenAI.
  • aud: debe coincidir con la audiencia de GetWebIdentityToken y con la del proveedor de identidades de cargas de trabajo de OpenAI.
  • sub: identifica el ARN de la entidad principal de IAM que solicitó el token. Es preferible exigir una coincidencia exacta con el ARN del rol.
  • Declaraciones específicas de AWS: toma el token decodificado como referencia antes de definir coincidencias por cuenta, organización, etiqueta de entidad principal o etiqueta de solicitud.

Usa la carga útil decodificada para comparar el token que recibiste con el emisor, la audiencia y los valores de asignación configurados en OpenAI. Puedes detectar la mayoría de los problemas de configuración en las declaraciones iss, aud y sub antes de intercambiar el token.

Configurar la federación de identidades de cargas de trabajo

Crea en OpenAI un proveedor de identidades de cargas de trabajo para el emisor de la cuenta de AWS. Luego agrega una asignación de cuenta de servicio que coincida con declaraciones estables del token emitido por AWS.

Configura primero el proveedor de identidades de cargas de trabajo y después crea la asignación de cuenta de servicio.

Configurar el proveedor de identidades de cargas de trabajo

  1. Crea el proveedor de identidades de cargas de trabajo. En Nombre, ingresa un valor único, como aws-outbound-prod. En Descripción, escribe algo que ayude a los administradores a identificar el proveedor, como Production AWS outbound identity federation workloads.

  2. Configura el emisor y la audiencia. En URL del emisor de OIDC, ingresa la URL del emisor de la cuenta de AWS que obtuviste al habilitar la federación de identidades saliente. Este valor debe coincidir con la declaración iss del token. En Audiencia, ingresa la misma audiencia que pasaste a GetWebIdentityToken. En este ejemplo, el valor es https://api.openai.com/v1.

  3. Usa el descubrimiento de OIDC de AWS. Deja desactivada la opción Usar el JWKS cargado para verificar tokens. OpenAI usa los metadatos de descubrimiento de OIDC y el JWKS del emisor de AWS para verificar el token emitido por AWS.

  4. Agrega transformaciones de atributos solo si necesitas atributos derivados para las asignaciones. Para definir coincidencias directamente con el token, puedes usar declaraciones escalares de nivel superior, como sub, aud e iss. Las declaraciones del espacio de nombres de AWS están anidadas bajo https://sts.amazonaws.com/. Para usarlas en asignaciones, primero crea atributos derivados con la notación de corchetes de CEL. Por ejemplo, ingresa aws_environment con la expresión assertion["https://sts.amazonaws.com/"]["principal_tags"]["environment"] para crear openai.aws_environment a partir del token decodificado del ejemplo anterior. Verifica la ruta de la declaración anidada en un token de muestra antes de usarla. Si no se puede evaluar una transformación, no se podrá resolver la asignación. Las declaraciones originales del token cuyo nombre ya empieza por openai. se ignoran al evaluar las claves de asignación con el prefijo openai., salvo que se configure la transformación correspondiente.

Configurar la asignación de cuenta de servicio

  1. Crea una asignación de cuenta de servicio. En Nombre, ingresa un valor único dentro del proveedor de identidades de cargas de trabajo, como aws-role-openai-wif. En Descripción, indica qué carga de trabajo puede usar la asignación, por ejemplo, Production AWS role for OpenAI API workload.

  2. Define la coincidencia con la entidad principal de AWS. En Clave, ingresa sub y, en Valor, el ARN de la entidad principal de IAM que aparece en el token decodificado, como arn:aws:iam::123456789012:role/OpenAIWifRole. Exigir una coincidencia exacta con la declaración sub ofrece el mayor grado de aislamiento para la federación de identidades saliente de AWS.

  3. Agrega condiciones de coincidencia para otras declaraciones si es necesario. Puedes definir coincidencias con cualquier declaración escalar o atributo transformado que esté disponible. Por ejemplo, si necesitas límites de confianza adicionales, usa atributos transformados que se deriven de declaraciones de AWS sobre la cuenta, la organización, las etiquetas de la entidad principal o las etiquetas de la solicitud.

  4. Elige el destino en OpenAI. En Proyecto, selecciona el proyecto de OpenAI al que pertenece la cuenta de servicio de destino. En Cuenta de servicio, selecciona la cuenta de servicio de OpenAI que puede usar la carga de trabajo de AWS, como aws-outbound-prod-openai-wif.

  5. Limita los permisos de la API si es necesario. Selecciona los Permisos adecuados, como api.model.request y api.vector_store.read, para restringir aún más el acceso que otorgan los tokens generados a partir de esta asignación. Deja el campo de permisos en blanco para evitar una restricción de alcance específica de WIF. El token seguirá otorgando acceso con los permisos de la cuenta de servicio asignada.

Usar el token en el código

Configura tu cliente del SDK de OpenAI para que solicite a AWS STS un token de OIDC emitido por AWS y lo intercambie por un token de acceso emitido por OpenAI.

Establece OPENAI_WIF_AUDIENCE en la misma audiencia que configuraste en el proveedor de identidades de cargas de trabajo de OpenAI. El proveedor de tokens de sujeto llama a la API GetWebIdentityToken de AWS STS con esa audiencia y devuelve el JWT emitido por AWS como token de sujeto. El SDK de OpenAI lo intercambia por un token de acceso emitido por OpenAI.

Autenticarse con un token de OIDC emitido por 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);

Prácticas recomendadas para AWS

  • Usa una identidad de AWS exclusiva para cada carga de trabajo. Usa roles de IAM distintos para la federación de identidades saliente de AWS y cuentas de servicio de Kubernetes distintas para las cargas de trabajo de EKS.
  • Configura una audiencia exclusiva para el acceso a OpenAI. Usa el mismo valor de audiencia en el token emitido por AWS o proyectado por EKS y en la configuración del proveedor de identidades de cargas de trabajo de OpenAI.
  • Usa tokens de duración razonablemente corta. Para la federación de identidades saliente de AWS, usa condiciones de IAM como sts:DurationSeconds. Para EKS, configura un plazo de vencimiento adecuado para el token proyectado.
  • Da preferencia a las coincidencias exactas de sujeto. Para los tokens salientes de AWS, exige una coincidencia con el ARN completo de la entidad principal de IAM. Para los tokens de EKS, exige una coincidencia con el sujeto completo de la cuenta de servicio de Kubernetes.
  • Define el alcance de las asignaciones con criterios estables. Usa la cuenta, la organización, el espacio de nombres o los atributos transformados cuando permitan reducir el acceso sin crear reglas de confianza demasiado amplias.
  • Vuelve a cargar los tokens al intercambiarlos. Solicita los tokens salientes de AWS cuando los necesites y lee los tokens proyectados de EKS desde la ruta del archivo montado para usar automáticamente los nuevos tokens después de cada rotación.
  • Otorga solo los permisos que requiere la carga de trabajo. Usa los permisos de la asignación para restringir aún más el acceso que otorga la cuenta de servicio de destino de OpenAI.