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
Theme

Como configurar a federação de identidades de cargas de trabalho para a AWS

Use a AWS como provedor de identidades de cargas de trabalho em 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 de curta duração da OpenAI.
  • Amazon EKS: troque um token projetado de conta de serviço do Amazon EKS por um token de acesso de curta duração da OpenAI.

A OpenAI aceita JWTs OIDC emitidos pela AWS por meio da federação de identidades de saída e tokens projetados de contas de serviço do Kubernetes emitidos pelo Amazon EKS. A OpenAI não aceita solicitações assinadas com SigV4 nem credenciais temporárias de chave de acesso do AWS STS como tokens de sujeito na 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.

Configurar a federação de identidades de saída da AWS

Habilite a federação de identidades de saída na conta da AWS que emitirá os tokens. Para saber como configurá-la, 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 que a AWS retorna para essa conta. Ao configurar o provedor de identidades de cargas de trabalho na OpenAI, use essa URL como emissor. Ela deve 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. No IAM, restrinja o público e o prazo máximo de validade dos tokens para que a entidade principal da AWS só possa emitir tokens destinados à OpenAI. Este exemplo permite emitir tokens para o público https://api.openai.com/v1 com validade 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 à AWS um token OIDC com o mesmo público que você configurará no provedor de identidades de cargas de trabalho da 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

Verificar 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. Em seguida, execute este script localmente para examinar as declarações do token:

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

Esse comando decodifica o payload do JWT sem verificar a assinatura do token. Use um decodificador local para tokens de produção e evite colar esses tokens em ferramentas de terceiros.

Após a decodificação, um token OIDC emitido pela AWS terá conteúdo semelhante a este:

{
  "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 fez 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 da sua conta da AWS informada no provedor de identidades de cargas de trabalho da OpenAI.
  • aud: deve corresponder ao público informado em GetWebIdentityToken e ao público configurado no provedor de identidades de cargas de trabalho da OpenAI.
  • sub: contém o ARN da entidade principal do IAM que solicitou o token. Prefira exigir uma correspondência exata com o ARN da função.
  • Declarações específicas da AWS: consulte o token decodificado para confirmar os valores da conta, da organização, das tags da entidade principal ou das tags da solicitação antes de usá-los como critérios de correspondência.

Use o payload decodificado para comparar o token recebido com o emissor, o público e os valores de mapeamento configurados na OpenAI. Antes de trocar o token, você pode identificar a maioria dos problemas de configuração nas declarações iss, aud e sub.

Configurar a federação de identidades de cargas de trabalho

Na OpenAI, crie um provedor de identidades de cargas de trabalho para o emissor da conta da AWS. Em seguida, adicione um mapeamento de conta de serviço que use declarações estáveis do token emitido pela AWS como critérios de correspondência.

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

Configurar o provedor de identidades de cargas de trabalho

  1. Crie o provedor de identidades de cargas de trabalho. Em Nome, informe um valor exclusivo, como aws-outbound-prod. Em Descrição, insira um texto como Production AWS outbound identity federation workloads para ajudar os administradores a identificar o provedor.

  2. Defina o emissor e o público. Em URL do emissor OIDC, informe a URL do emissor da conta que a AWS retornou quando você habilitou a federação de identidades de saída. Esse valor deve corresponder à declaração iss do token. Em Público, informe o mesmo público passado a GetWebIdentityToken. Neste exemplo, o valor é https://api.openai.com/v1.

  3. Use a descoberta OIDC da AWS. Mantenha a opção Usar o JWKS enviado para verificar o token 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. Você pode usar declarações escalares de nível superior, como sub, aud e iss, diretamente como critérios de correspondência. As declarações específicas da AWS ficam aninhadas no namespace https://sts.amazonaws.com/. Para usá-las em mapeamentos, primeiro crie atributos derivados com a notação de colchetes da CEL. 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 token decodificado do exemplo acima. Antes de usar a declaração aninhada, verifique o caminho dela em um token de exemplo. Se não for possível avaliar uma transformação, a resolução do mapeamento falhará. As declarações originais do token cujo nome já começa com openai. são ignoradas nas chaves de mapeamento com o prefixo openai., a menos que você configure uma transformação correspondente.

Configurar o mapeamento de conta de serviço

  1. Crie um mapeamento de conta de serviço. Em Nome, informe um valor exclusivo dentro do provedor de identidades de cargas de trabalho, como aws-role-openai-wif. Em Descrição, insira um texto como Production AWS role for OpenAI API workload para indicar qual carga de trabalho pode usar o mapeamento.

  2. Defina o critério de correspondência para a entidade principal da AWS. Em Chave, informe sub. Em Valor, informe o ARN da entidade principal do IAM presente no token decodificado, como arn:aws:iam::123456789012:role/OpenAIWifRole. Exigir uma correspondência exata com a declaração sub oferece o maior grau de isolamento na federação de identidades de saída da AWS.

  3. Adicione critérios de correspondência para outras declarações, se necessário. Você pode usar qualquer declaração escalar ou atributo transformado disponível. Por exemplo, se precisar de limites de confiança adicionais, use atributos transformados a partir das declarações da AWS sobre a conta, a organização, as tags da entidade principal ou as tags da solicitação.

  4. Escolha o destino na OpenAI. Em Projeto, selecione o projeto da OpenAI ao qual pertence a conta de serviço de destino. Em Conta de serviço, selecione 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 apropriadas, como api.model.request e api.vector_store.read, para limitar ainda mais o acesso concedido pelos tokens emitidos com esse mapeamento. Deixe as permissões em branco se quiser evitar uma restrição de escopo específica da federação de identidades de cargas de trabalho. Nesse caso, o token continua autorizando o acesso com as permissões da conta de serviço mapeada.

Usar o token no código

Configure o cliente do SDK da OpenAI 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 com o mesmo público configurado no provedor de identidades de cargas de trabalho da OpenAI. O provedor de tokens de sujeito chama a API GetWebIdentityToken do AWS STS com esse público e retorna o JWT emitido pela AWS como token de sujeito. O SDK da OpenAI troca esse JWT por um token de acesso emitido pela OpenAI.

Autenticar 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 a AWS

  • Use uma identidade da AWS dedicada a cada carga de trabalho. Use funções distintas do IAM para a federação de identidades de saída da AWS e contas de serviço distintas do Kubernetes para as cargas de trabalho do EKS.
  • Configure um público específico para o acesso à OpenAI. Use o mesmo valor de público no token emitido pela AWS ou no token projetado do EKS e na configuração do provedor de identidades de cargas de trabalho da OpenAI.
  • Mantenha os prazos de validade dos tokens relativamente curtos. Para a federação de identidades de saída da AWS, use condições do IAM como sts:DurationSeconds. Para o EKS, defina um prazo de validade adequado para o token projetado.
  • Prefira a correspondência exata do sujeito. Para tokens de saída da AWS, exija correspondência com o ARN completo da entidade principal do IAM. Para tokens do EKS, exija correspondência com o sujeito completo da conta de serviço do Kubernetes.
  • Delimite o escopo dos mapeamentos com critérios estáveis. Use a conta, a organização, o namespace ou atributos transformados quando esses critérios restringirem o acesso sem criar regras de confiança amplas.
  • Obtenha a versão atual do token a cada troca. Solicite tokens de saída da AWS quando necessário e leia os tokens projetados do EKS no caminho em que o arquivo está montado para usar automaticamente os novos tokens após a rotação.
  • Conceda apenas as permissões necessárias para a carga de trabalho. Use as permissões do mapeamento para restringir ainda mais o acesso concedido pela conta de serviço de destino da OpenAI.