For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
기본 탐색 메뉴
Theme

AWS용 워크로드 아이덴티티 페더레이션 구성

다음 두 가지 방식 중 하나로 AWS를 워크로드 아이덴티티 공급자로 사용할 수 있습니다.

  • AWS 아웃바운드 아이덴티티 페더레이션: GetWebIdentityToken을 호출해 AWS STS가 발급한 OIDC JWT를 받은 뒤, 유효 기간이 짧은 OpenAI 액세스 토큰으로 교환합니다.
  • Amazon EKS: 파드에 프로젝션된 Amazon EKS 서비스 계정 토큰을 유효 기간이 짧은 OpenAI 액세스 토큰으로 교환합니다.

OpenAI는 AWS가 아웃바운드 아이덴티티 페더레이션을 통해 발급한 OIDC JWT와 Amazon EKS가 발급한 Kubernetes 프로젝션 서비스 계정 토큰을 지원합니다. SigV4로 서명한 요청이나 AWS STS 임시 액세스 키 자격 증명은 워크로드 아이덴티티 페더레이션의 주체 토큰으로 지원하지 않습니다.

AWS 아웃바운드 아이덴티티 페더레이션

AWS 아웃바운드 아이덴티티 페더레이션을 사용하면 AWS 보안 주체가 AWS STS에 서명된 OIDC JWT를 요청해 외부 서비스에 제시할 수 있습니다. OpenAI 워크로드 아이덴티티 페더레이션에서는 AWS가 발급한 JWT가 주체 토큰 역할을 합니다. OpenAI는 이 토큰을 검증한 뒤 OpenAI 액세스 토큰을 발급합니다.

AWS 아웃바운드 아이덴티티 페더레이션 설정

토큰을 발급할 AWS 계정에서 아웃바운드 아이덴티티 페더레이션을 활성화하세요. 자세한 설정 방법은 AWS의 아웃바운드 아이덴티티 페더레이션 시작하기를 참고하세요.

aws iam enable-outbound-web-identity-federation

AWS가 반환한 계정별 발급자 URL을 기록해 두세요. 이 URL은 OpenAI 워크로드 아이덴티티 공급자의 발급자로 설정할 값이며, AWS가 발급한 토큰의 iss 클레임과 일치해야 합니다.

STS 글로벌 엔드포인트에서는 AWS STS GetWebIdentityToken API를 사용할 수 없습니다. AWS CLI 또는 SDK에서 리전별 STS 엔드포인트를 사용하도록 설정하세요.

워크로드에 sts:GetWebIdentityToken 호출 권한을 부여하세요. AWS 보안 주체가 OpenAI용 토큰만 발급받도록 IAM에서 대상과 토큰의 최대 유효 기간을 제한하세요. 다음 예시에서는 대상이 https://api.openai.com/v1이고 유효 기간이 최대 300초인 토큰을 허용합니다.

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

OpenAI 워크로드 아이덴티티 공급자에 설정할 대상과 동일한 값을 지정해 AWS에 OIDC 토큰을 요청하세요. 서명 알고리즘은 ES384를 사용하세요. 환경에서 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

AWS가 발급한 토큰 확인

워크로드 아이덴티티 페더레이션을 구성하기 전에 AWS가 발급한 토큰을 환경 변수 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);

이 명령어는 토큰 서명을 검증하지 않고 JWT 페이로드를 디코딩합니다. 프로덕션 토큰은 로컬 디코더로 디코딩하고 타사 도구에 붙여넣지 마세요.

AWS가 발급한 OIDC 토큰을 디코딩하면 다음과 비슷한 결과를 볼 수 있습니다.

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

AWS가 발급한 토큰에 포함되는 AWS 전용 클레임은 토큰마다 다를 수 있습니다. https://sts.amazonaws.com/ 아래의 클레임은 호출한 보안 주체, 세션 컨텍스트, 요청 태그에 따라 달라집니다.

OpenAI에 설정할 클레임을 확인하세요.

  • iss: OpenAI 워크로드 아이덴티티 공급자에 설정한 AWS 계정별 발급자 URL과 일치해야 합니다.
  • aud: GetWebIdentityToken 호출 시 지정한 대상 및 OpenAI 워크로드 아이덴티티 공급자에 설정한 대상과 일치해야 합니다.
  • sub: 토큰을 요청한 IAM 보안 주체의 ARN을 나타냅니다. 가능하면 역할 ARN 전체가 정확히 일치하도록 설정하세요.
  • AWS 전용 클레임: 계정, 조직, 보안 주체 태그 또는 요청 태그를 일치 조건으로 지정하기 전에 디코딩한 토큰에서 실제 값을 확인하세요.

디코딩한 페이로드의 값을 OpenAI에 설정한 발급자, 대상, 매핑 값과 비교하세요. 대부분의 구성 문제는 토큰을 교환하기 전에 iss, aud, sub 클레임에서 확인할 수 있습니다.

워크로드 아이덴티티 페더레이션 설정

OpenAI에서 AWS 계정의 발급자에 해당하는 워크로드 아이덴티티 공급자를 만든 뒤, AWS가 발급한 토큰에서 값이 일정하게 유지되는 클레임을 기준으로 서비스 계정 매핑을 추가하세요.

먼저 워크로드 아이덴티티 공급자를 구성한 다음 서비스 계정 매핑을 만드세요.

워크로드 아이덴티티 공급자 설정

  1. 워크로드 아이덴티티 공급자를 만드세요. 이름 필드에 aws-outbound-prod와 같이 고유한 값을 입력하세요. 설명 필드에는 Production AWS outbound identity federation workloads와 같이 관리자가 공급자를 식별하는 데 도움이 되는 내용을 입력하세요.

  2. 발급자와 대상을 설정하세요. OIDC 발급자 URL 필드에 아웃바운드 아이덴티티 페더레이션을 활성화했을 때 반환된 AWS 계정별 발급자 URL을 입력하세요. 이 값은 토큰의 iss 클레임과 일치해야 합니다. 대상 필드에는 GetWebIdentityToken 호출 시 전달한 대상과 동일한 값을 입력하세요. 이 예시의 값은 https://api.openai.com/v1입니다.

  3. AWS OIDC 디스커버리를 사용하세요. 토큰 검증에 업로드한 JWKS 사용 옵션은 비활성화 상태로 두세요. OpenAI는 AWS 발급자의 OIDC 디스커버리 메타데이터와 JWKS를 사용해 AWS가 발급한 토큰을 검증합니다.

  4. 매핑에 파생 속성이 필요한 경우에만 속성 변환을 추가하세요. 원본 토큰에서 직접 값을 비교할 때는 sub, aud, iss와 같은 최상위 스칼라 클레임을 사용할 수 있습니다. AWS 전용 네임스페이스의 클레임은 https://sts.amazonaws.com/ 아래에 중첩되어 있으므로, 매핑에 사용하려면 먼저 CEL 대괄호 표기법으로 파생 속성을 만드세요. 예를 들어 속성 이름으로 aws_environment를 입력하고 표현식으로 assertion["https://sts.amazonaws.com/"]["principal_tags"]["environment"]를 지정하면 위에서 디코딩한 예시 토큰의 값으로 openai.aws_environment를 만들 수 있습니다. 중첩된 클레임 경로는 사용하기 전에 샘플 토큰에서 확인하세요. 변환식을 평가할 수 없으면 매핑을 결정할 수 없습니다. 원본 토큰의 클레임 이름이 이미 openai.로 시작하더라도 해당 변환을 설정하지 않으면 openai. 매핑 키에는 그 클레임이 사용되지 않습니다.

서비스 계정 매핑 설정

  1. 서비스 계정 매핑을 만드세요. 이름 필드에 aws-role-openai-wif와 같이 워크로드 아이덴티티 공급자 내에서 고유한 값을 입력하세요. 설명 필드에는 Production AWS role for OpenAI API workload와 같이 이 매핑을 사용할 수 있는 워크로드를 명시하세요.

  2. AWS 보안 주체를 일치 조건으로 지정하세요. 키 필드에 sub를 입력하고, 값 필드에는 arn:aws:iam::123456789012:role/OpenAIWifRole과 같이 디코딩한 토큰에서 확인한 IAM 보안 주체의 ARN을 입력하세요. AWS 아웃바운드 아이덴티티 페더레이션에서는 sub 클레임 전체가 정확히 일치하도록 설정할 때 보안 주체를 가장 엄격하게 격리할 수 있습니다.

  3. 필요하면 클레임 일치 조건을 추가하세요. 사용 가능한 스칼라 클레임이나 변환된 속성을 일치 조건으로 지정할 수 있습니다. 예를 들어 신뢰 경계를 추가로 설정해야 한다면 AWS 계정, 조직, 보안 주체 태그 또는 요청 태그 클레임에서 파생한 속성을 사용하세요.

  4. OpenAI에서 사용할 대상을 선택하세요. 프로젝트 항목에서 대상 서비스 계정이 속한 OpenAI 프로젝트를 선택하세요. 서비스 계정 항목에서 aws-outbound-prod-openai-wif와 같이 AWS 워크로드가 사용할 수 있는 OpenAI 서비스 계정을 선택하세요.

  5. 필요하면 API 권한을 제한하세요. 권한 항목에서 api.model.request, api.vector_store.read 등 필요한 권한을 선택해 이 매핑으로 발급되는 액세스 토큰의 권한 범위를 더 좁히세요. WIF 전용 범위 제한을 추가하지 않으려면 권한을 비워 두세요. 이 경우에도 토큰에는 매핑된 서비스 계정의 권한이 적용됩니다.

코드에서 토큰 사용

OpenAI SDK 클라이언트가 AWS STS에 OIDC 토큰을 요청하고, AWS가 발급한 토큰을 OpenAI 액세스 토큰으로 교환하도록 구성하세요.

OPENAI_WIF_AUDIENCE를 OpenAI 워크로드 아이덴티티 공급자에 설정한 대상과 동일한 값으로 설정하세요. 주체 토큰 공급자는 이 대상을 지정해 AWS STS GetWebIdentityToken을 호출하고 AWS가 발급한 JWT를 주체 토큰으로 반환합니다. OpenAI SDK는 이 토큰을 OpenAI가 발급하는 액세스 토큰으로 교환합니다.

AWS가 발급한 OIDC 토큰으로 인증하기
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);

AWS 모범 사례

  • 워크로드마다 전용 AWS 아이덴티티를 사용하세요. AWS 아웃바운드 아이덴티티 페더레이션에서는 워크로드별로 별도의 IAM 역할을 사용하고, EKS에서는 워크로드별로 별도의 Kubernetes 서비스 계정을 사용하세요.
  • OpenAI 액세스 전용 대상을 설정하세요. AWS가 발급한 토큰 또는 EKS 프로젝션 토큰의 대상 값은 OpenAI 워크로드 아이덴티티 공급자에 설정한 대상 값과 같아야 합니다.
  • 토큰의 유효 기간을 적절히 짧게 설정하세요. AWS 아웃바운드 아이덴티티 페더레이션에서는 sts:DurationSeconds와 같은 IAM 조건을 사용하고, EKS에서는 프로젝션 토큰에 적절한 유효 기간을 지정하세요.
  • 가능하면 주체 전체가 정확히 일치하도록 설정하세요. AWS 아웃바운드 토큰에서는 IAM 보안 주체의 ARN 전체를, EKS 토큰에서는 Kubernetes 서비스 계정의 주체 값 전체를 일치 조건으로 사용하세요.
  • 매핑 범위는 안정적으로 유지되는 경계를 기준으로 정하세요. 광범위한 신뢰 규칙을 만들지 않고도 액세스 범위를 좁힐 수 있다면 계정, 조직, 네임스페이스 또는 변환된 속성을 사용하세요.
  • 토큰을 교환할 때마다 다시 가져오세요. AWS 아웃바운드 토큰은 필요할 때 요청하고, EKS 프로젝션 토큰은 갱신된 토큰이 자동으로 반영되도록 마운트된 파일 경로에서 읽으세요.
  • 워크로드에 필요한 권한만 부여하세요. 매핑 수준에서 권한을 설정해 대상 OpenAI 서비스 계정이 부여하는 액세스 범위를 더 좁히세요.