For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal

Configuração da federação de identidades de cargas de trabalho para a AWS

Use a AWS como provedor de identidade de cargas de trabalho em qualquer um destes cenários:

  • Federação de identidades de saída da AWS: Troque um JWT OIDC emitido pelo AWS STS por meio de GetWebIdentityToken por um token de acesso da OpenAI de curta duração.
  • Amazon EKS: Troque um token projetado de conta de serviço do Amazon EKS por um token de acesso da OpenAI de curta duração.

Para o Codex, use esta página para obter e inspecionar o token da AWS. Depois, configure a identidade de cargas de trabalho do Codex para gravar esse token em um arquivo e indicar o arquivo ao Codex. O mapeamento de conta de serviço e os exemplos de SDK desta página se aplicam à API da OpenAI.

A OpenAI oferece suporte a JWTs OIDC emitidos pela AWS por meio da federação de identidades de saída e a tokens projetados de contas de serviço do Kubernetes emitidos pelo Amazon EKS. A OpenAI não oferece suporte a solicitações assinadas com SigV4 nem a credenciais de chave de acesso temporárias do AWS STS como tokens de sujeito para a federação de identidades de cargas de trabalho.

Federação de identidades de saída da AWS

A federação de identidades de saída da AWS permite que uma entidade principal da AWS solicite um JWT OIDC assinado ao AWS STS e apresente esse token a um serviço externo. Na federação de identidades de cargas de trabalho da OpenAI, o JWT emitido pela AWS é o token de sujeito que a OpenAI valida antes de emitir um token de acesso da OpenAI.

Configuração da federação de identidades de saída da AWS

Ative a federação de identidades de saída para a conta da AWS que emitirá os tokens. Para obter detalhes da configuração, consulte o guia da AWS sobre os primeiros passos com a federação de identidades de saída.

aws iam enable-outbound-web-identity-federation

Anote a URL do emissor específica da conta retornada pela AWS. Você configurará esse valor como o emissor do provedor de identidade de cargas de trabalho na OpenAI, e ele deverá corresponder à declaração iss dos tokens emitidos pela AWS.

A API GetWebIdentityToken do AWS STS não está disponível no endpoint global do STS. Configure a CLI ou o SDK da AWS para usar um endpoint regional do STS.

Conceda à carga de trabalho permissão para chamar sts:GetWebIdentityToken. Restrinja o público-alvo e a duração máxima do token no IAM para que a entidade principal da AWS possa emitir apenas tokens destinados à OpenAI. Este exemplo permite tokens para o público-alvo https://api.openai.com/v1 com duração 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
        }
      }
    }
  ]
}

Solicite um token OIDC emitido pela AWS com o mesmo público-alvo que você configurará no provedor de identidade de cargas de trabalho na OpenAI. Use ES384, a menos que seu ambiente exija compatibilidade com 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

Verifique o token emitido pela AWS

Antes de configurar a federação de identidades de cargas de trabalho, exporte o token emitido pela AWS como TOKEN e execute este script localmente para inspecionar suas declarações:

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 o payload do JWT sem verificar a assinatura do token. Use um decodificador local para tokens de produção e evite colar tokens de produção em ferramentas de terceiros.

Um token OIDC emitido pela AWS, após ser decodificado, será semelhante a:

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

Nem todo token emitido pela AWS contém todas as declarações específicas da AWS. As declarações em https://sts.amazonaws.com/ dependem da entidade principal que faz a chamada, do contexto da sessão e das tags da solicitação.

Verifique as declarações que você pretende configurar na OpenAI:

  • iss: deve corresponder à URL do emissor específica da conta da AWS configurada no provedor de identidade de cargas de trabalho na OpenAI.
  • aud: deve corresponder ao público-alvo de GetWebIdentityToken e ao público-alvo do provedor de identidade de cargas de trabalho na OpenAI.
  • sub: identifica o ARN da entidade principal do IAM que solicitou o token. Prefira uma correspondência exata com o ARN da função.
  • Declarações específicas da AWS: use o token decodificado como fonte de referência antes de configurar correspondências com valores de conta, organização, tags da entidade principal ou tags da solicitação.

Use o payload decodificado para comparar o token recebido com os valores de emissor, público-alvo e mapeamento configurados na OpenAI. A maioria dos problemas de configuração pode ser identificada nas declarações iss, aud e sub antes de trocar o token.

Configuração da federação de identidades de cargas de trabalho

Crie um provedor de identidade de cargas de trabalho na OpenAI para o emissor da conta da AWS e adicione um mapeamento de conta de serviço que corresponda a declarações estáveis do token emitido pela AWS.

Configure primeiro o provedor de identidade de cargas de trabalho e, depois, crie o mapeamento de conta de serviço.

Configure o provedor de identidade de cargas de trabalho

  1. Crie o provedor de identidade de cargas de trabalho. Defina Nome como um valor exclusivo, como aws-outbound-prod. Use o campo Descrição, com um valor como Production AWS outbound identity federation workloads, para ajudar os administradores a identificar o provedor.

  2. Defina o emissor e o público-alvo. Defina URL do emissor OIDC como a URL do emissor específica da conta da AWS retornada quando a federação de identidades de saída foi ativada. Esse valor deve corresponder à declaração iss do token. Defina Público-alvo como o mesmo público-alvo passado a GetWebIdentityToken. Neste exemplo, esse valor é https://api.openai.com/v1.

  3. Use a descoberta OIDC da AWS. Mantenha a opção Usar JWKS enviado para verificação de tokens desativada. A OpenAI usa os metadados de descoberta OIDC e o JWKS do emissor da AWS para verificar o token emitido pela AWS.

  4. Adicione transformações de atributos somente se precisar de atributos derivados para o mapeamento. A correspondência direta com o token oferece suporte a declarações escalares de nível superior, como sub, aud e iss. As declarações específicas da AWS com namespace ficam aninhadas em https://sts.amazonaws.com/, portanto, crie atributos derivados com a notação de colchetes da CEL antes de usá-las em mapeamentos. Por exemplo, insira aws_environment com a expressão assertion["https://sts.amazonaws.com/"]["principal_tags"]["environment"] para criar openai.aws_environment a partir do exemplo de token decodificado acima. Verifique o caminho da declaração aninhada em um token de amostra antes de usá-lo; se uma transformação não puder ser avaliada, a resolução do mapeamento falhará. As declarações originais do token que já começam com openai. são ignoradas para chaves de mapeamento openai., a menos que uma transformação correspondente esteja configurada.

Configure o mapeamento de conta de serviço

  1. Crie um mapeamento de conta de serviço. Defina Nome como um valor exclusivo dentro do provedor de identidade de cargas de trabalho, como aws-role-openai-wif. Use o campo Descrição, com um valor como Production AWS role for OpenAI API workload, para explicar qual carga de trabalho pode usar o mapeamento.

  2. Configure a correspondência com a entidade principal da AWS. Defina Chave como sub e Valor como o ARN da entidade principal do IAM presente no token decodificado, como arn:aws:iam::123456789012:role/OpenAIWifRole. A correspondência exata com a declaração sub oferece o isolamento mais forte para a federação de identidades de saída da AWS.

  3. Adicione correspondências com outras declarações, se necessário. Você pode configurar correspondências com qualquer declaração escalar ou atributo transformado disponível. Por exemplo, use atributos transformados derivados de declarações de conta da AWS, organização, tags da entidade principal ou tags da solicitação se precisar de limites de confiança adicionais.

  4. Escolha o destino na OpenAI. Defina Projeto como o projeto da OpenAI ao qual pertence a conta de serviço de destino. Defina Conta de serviço como a conta de serviço da OpenAI que a carga de trabalho da AWS pode usar, como aws-outbound-prod-openai-wif.

  5. Restrinja as permissões da API, se necessário. Selecione as Permissões adequadas, como api.model.request e api.vector_store.read, para restringir ainda mais o acesso dos tokens emitidos a partir deste mapeamento. Deixe as permissões em branco para não adicionar uma restrição de escopo específica de WIF; o token continua autorizando o acesso como a conta de serviço mapeada.

Uso do token no código

Configure seu cliente do OpenAI SDK para solicitar ao AWS STS um token OIDC emitido pela AWS e trocá-lo por um token de acesso emitido pela OpenAI.

Defina OPENAI_WIF_AUDIENCE como o mesmo público-alvo configurado no provedor de identidade de cargas de trabalho na OpenAI. O provedor de tokens de sujeito chama GetWebIdentityToken do AWS STS com esse público-alvo e retorna o JWT emitido pela AWS como token de sujeito. Em seguida, o OpenAI SDK troca esse token por um token de acesso emitido pela OpenAI.

Autentique-se com um token OIDC emitido pela 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áticas recomendadas para AWS

  • Use uma identidade AWS dedicada para cada carga de trabalho. Use funções IAM separadas para a federação de identidades de saída da AWS e contas de serviço do Kubernetes separadas para as cargas de trabalho do EKS.
  • Configure um público-alvo dedicado para o acesso à OpenAI. Use o mesmo valor de público-alvo no token emitido pela AWS ou projetado pelo EKS e na configuração do Provedor de identidade de cargas de trabalho da OpenAI.
  • Mantenha os prazos de validade dos tokens razoavelmente curtos. Para a federação de identidades de saída da AWS, use condições IAM como sts:DurationSeconds; para o EKS, defina uma expiração adequada para o token projetado.
  • Prefira a correspondência exata do sujeito. Use o ARN completo da entidade principal do IAM para a correspondência dos tokens de saída da AWS ou o sujeito completo da conta de serviço do Kubernetes para os tokens do EKS.
  • Defina o escopo dos mapeamentos com base em limites estáveis. Use conta, organização, namespace ou atributos transformados quando eles restringirem o acesso sem criar regras de confiança amplas.
  • Recarregue os tokens ao trocá-los. Solicite tokens de saída da AWS quando necessário e leia os tokens projetados do EKS no caminho do arquivo montado para que os tokens atualizados pela rotação sejam usados automaticamente.
  • Conceda apenas as permissões necessárias para a carga de trabalho. Use permissões no nível do mapeamento para restringir ainda mais o acesso concedido pela conta de serviço de destino da OpenAI.