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

Configuración de la federación de identidades de carga de trabajo para AWS

Usa AWS como proveedor de identidades de carga de trabajo en cualquiera de estos escenarios:

  • Federación de identidades salientes 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 cuenta de servicio de Amazon EKS por un token de acceso de OpenAI de corta duración.

Para Codex, usa esta página para obtener e inspeccionar el token de AWS. Luego, configura la identidad de carga de trabajo de Codex para escribir ese token en un archivo e indicarle a Codex dónde encontrarlo. La asignación de cuentas de servicio y los ejemplos del SDK de esta página se aplican a la API de OpenAI.

OpenAI admite JWT de OIDC emitidos por AWS mediante la federación de identidades salientes y tokens proyectados de cuentas de servicio de Kubernetes emitidos por Amazon EKS. OpenAI no admite solicitudes firmadas con SigV4 ni credenciales de claves de acceso temporales de AWS STS como tokens de sujeto para la federación de identidades de carga de trabajo.

Federación de identidades salientes de AWS

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

Configuración de la federación de identidades salientes de AWS

Habilita la federación de identidades salientes para la cuenta de AWS que emitirá los tokens. Para obtener detalles de configuración, consulta la guía de AWS sobre los primeros pasos con la federación de identidades salientes.

aws iam enable-outbound-web-identity-federation

Registra la URL del emisor específica de la cuenta que devuelve AWS. Configurarás este valor como emisor en el proveedor de identidades de carga de trabajo de OpenAI, y debe coincidir con la declaración iss de los tokens emitidos por 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 usar 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 de los tokens en IAM para que la entidad principal de AWS solo pueda emitir tokens destinados a OpenAI. Este ejemplo permite 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 un token de OIDC emitido por AWS con la misma audiencia que configurarás en el proveedor de identidades de carga 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

Verifica el token emitido por AWS

Antes de configurar la federación de identidades de carga de trabajo, exporta el token emitido por AWS como TOKEN y luego ejecuta este script localmente para inspeccionar 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.

Un token de OIDC emitido por AWS, una vez decodificado, tendrá un aspecto similar al siguiente:

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

No todos los tokens emitidos por AWS contienen todas las declaraciones específicas de AWS. Las declaraciones bajo https://sts.amazonaws.com/ dependen de la entidad principal que realiza la llamada, del contexto de la sesión y de las etiquetas de la solicitud.

Verifica las declaraciones que planeas configurar en OpenAI:

  • iss: debe coincidir con la URL del emisor específica de la cuenta de AWS configurada en el proveedor de identidades de carga de trabajo de OpenAI.
  • aud: debe coincidir con la audiencia de GetWebIdentityToken y con la audiencia del proveedor de identidades de carga de trabajo de OpenAI.
  • sub: identifica el ARN de la entidad principal de IAM que solicitó el token. Prioriza la coincidencia exacta con el ARN del rol.
  • Declaraciones específicas de AWS: usa el token decodificado como fuente de referencia antes de configurar coincidencias con valores de cuenta, organización, etiquetas de la entidad principal o etiquetas de la solicitud.

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

Configuración de la federación de identidades de carga de trabajo

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

Primero configura el proveedor de identidades de carga de trabajo y luego crea la asignación de cuenta de servicio.

Configura el proveedor de identidades de carga de trabajo

  1. Crea el proveedor de identidades de carga de trabajo. Establece Nombre en un valor único, como aws-outbound-prod. Usa Descripción, por ejemplo, Production AWS outbound identity federation workloads, para ayudar a los administradores a identificar el proveedor.

  2. Establece el emisor y la audiencia. Establece URL del emisor de OIDC en la URL del emisor específica de la cuenta de AWS que se devolvió al habilitar la federación de identidades salientes. Este valor debe coincidir con la declaración iss del token. Establece Audiencia en la misma audiencia que se pasó a GetWebIdentityToken. En este ejemplo, ese valor es https://api.openai.com/v1.

  3. Usa el descubrimiento de OIDC de AWS. Deja deshabilitada la opción Usar 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. La búsqueda de coincidencias en el token sin transformar admite declaraciones escalares de nivel superior, como sub, aud y iss. Las declaraciones específicas de AWS con espacio de nombres están anidadas bajo https://sts.amazonaws.com/, así que crea atributos derivados con la notación de corchetes de CEL antes de usarlas en asignaciones. 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 ejemplo de token decodificado 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, la resolución de la asignación falla. Las declaraciones sin transformar del token que ya comienzan con openai. se ignoran para las claves de asignación openai., a menos que se configure una transformación correspondiente.

Configura la asignación de cuenta de servicio

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

  2. Configura la coincidencia con la entidad principal de AWS. Establece Clave en sub y Valor en el ARN de la entidad principal de IAM del token decodificado, como arn:aws:iam::123456789012:role/OpenAIWifRole. La coincidencia exacta con la declaración sub proporciona el mayor aislamiento para la federación de identidades salientes de AWS.

  3. Agrega coincidencias con otras declaraciones si es necesario. Puedes configurar coincidencias con cualquier declaración escalar o atributo transformado disponible. Por ejemplo, usa atributos transformados derivados de declaraciones de cuenta de AWS, organización, etiquetas de la entidad principal o etiquetas de la solicitud si necesitas límites de confianza adicionales.

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

  5. Restringe 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 los tokens de acceso emitidos a partir de esta asignación. Deja los permisos en blanco para evitar agregar una restricción de alcance específica de WIF; el token seguirá autorizando el acceso como la cuenta de servicio asignada.

Uso del token en el código

Configura tu cliente del SDK de OpenAI para solicitar a AWS STS un token de OIDC emitido por AWS e intercambiarlo por un token de acceso emitido por OpenAI.

Establece OPENAI_WIF_AUDIENCE en la misma audiencia configurada en el proveedor de identidades de carga de trabajo de OpenAI. El proveedor de tokens de sujeto llama a 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.

Autenticación 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 dedicada para cada carga de trabajo. Usa roles de IAM separados para la federación de identidades salientes de AWS y cuentas de servicio de Kubernetes separadas para las cargas de trabajo de EKS.
  • Configura una audiencia dedicada para el acceso a OpenAI. Usa el mismo valor de audiencia en el token emitido por AWS o proyectado de EKS y en la configuración del proveedor de identidad de carga de trabajo de OpenAI.
  • Mantén tiempos de validez de los tokens razonablemente cortos. Para la federación de identidades salientes de AWS, usa condiciones de IAM como sts:DurationSeconds; para EKS, establece un vencimiento adecuado para el token proyectado.
  • Prefiere la coincidencia exacta del sujeto. Para los tokens salientes de AWS, establece la coincidencia con el ARN completo de la entidad principal de IAM; para los tokens de EKS, usa el sujeto completo de la cuenta de servicio de Kubernetes.
  • Limita las asignaciones a ámbitos estables. Usa atributos de cuenta, organización o espacio de nombres, o atributos transformados, cuando reduzcan el acceso sin crear reglas de confianza demasiado amplias.
  • Vuelve a cargar los tokens al intercambiarlos. Solicita tokens salientes de AWS cuando los necesites y lee los tokens proyectados de EKS desde la ruta del archivo montado para que los tokens se utilicen automáticamente después de su rotación.
  • Otorga solo los permisos que necesita la carga de trabajo. Usa los permisos de la asignación para restringir aún más el acceso otorgado por la cuenta de servicio de OpenAI de destino.