IRSA 크로스 계정 인증 — EKS Pod의 다른 계정 Bedrock 접근

AI 인프라3분조회

IRSA(IAM Roles for Service Accounts)는 EKS 파드에 액세스 키 없이 IAM 권한을 넘겨주는 방식이고, Bedrock 은 여러 LLM 을 API 하나로 호출하는 AWS 관리형 서비스입니다.

LLM 게이트웨이가 Bedrock 을 호출하는데 액세스 키를 환경변수로 들고 있었습니다. IRSA 로 바꾸는 작업이었는데, Bedrock 권한이 다른 계정에 있어서 역할이 두 개 필요했습니다.

두 역할의 서로 다른 임무

[ 운영 계정 ]
  EKS Pod (litellm-sa)
    │  ServiceAccount annotation → eks.amazonaws.com/role-arn
    ↓  IRSA (OIDC 토큰 자동 교환)
  litellm-eks-role
    │  앱 설정의 aws_role_name → AssumeRole 호출

[ GPU 전용 계정 ]
  litellm-bedrock-access-role   (실제 Bedrock 권한을 가진 쪽)

  AWS Bedrock API

eks.amazonaws.com/role-arn 은 파드가 먼저 얻는 역할이고 운영 계정에 있는데, 이것만으로는 Bedrock 을 못 씁니다. 실제 Bedrock 권한은 GPU 전용 계정의 aws_role_name — 그 자격증명으로 넘어갈 대상 역할 — 이 쥐고 있습니다.

하나는 진입 지점이고 하나는 목적지라, 둘을 같은 것으로 놓고 설정하면 안 맞습니다.

Trust Policy 도 양쪽에 걸어야 합니다.

Role 계정 설정
litellm-eks-role 운영 EKS OIDC trust + 대상 역할을 assume 할 수 있는 정책
litellm-bedrock-access-role GPU 전용 Trust policy 에 운영 계정 역할 ARN 추가

액세스 키 제거

ServiceAccount 를 만들고 annotation 을 답니다.

serviceAccount:
  create: true
  name: "litellm-sa"
  annotations:
    eks.amazonaws.com/role-arn: "arn:aws:iam::111111111111:role/litellm-eks-role"

모델 설정에서 키를 빼고 대상 역할을 넣습니다. 모델이 여러 개면 전부 같은 방식으로 바꿔야 합니다.

# 제거
- aws_access_key_id: os.environ/AWS_BEDROCK_ACCESS_KEY_ID
- aws_secret_access_key: os.environ/AWS_BEDROCK_SECRET_ACCESS_KEY

# 추가
+ aws_role_name: arn:aws:iam::222222222222:role/litellm-bedrock-access-role
  aws_region_name: us-east-1

S3 캐시 섹션에도 액세스 키가 들어 있어서 그 섹션은 통째로 걷어냈습니다. 키를 지우는 작업을 할 때는 설정 파일 전체를 훑어야 합니다. 한 군데만 지우면 나머지가 그대로 남습니다.

환경변수로 적용 확인

IRSA 가 붙으면 AWS SDK 가 쓰는 환경변수가 파드에 자동으로 주입됩니다.

kubectl exec -n litellm deploy/litellm -- env | grep AWS

이 둘이 있어야 정상입니다.

AWS_ROLE_ARN
AWS_WEB_IDENTITY_TOKEN_FILE

그리고 이 둘이 없어야 정상입니다.

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

키가 남아 있으면 SDK 가 그쪽을 먼저 씁니다. IRSA 를 붙였는데도 예전 키로 동작하고 있을 수 있습니다. 있어야 할 것만 확인하지 말고 없어야 할 것도 같이 봐야 합니다.

참고

  1. 불러오는 중