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

AI 인프라20분조회 –

LLM 게이트웨이는 EKS 에 파드로 떠서 여러 모델을 한 API 로 부를 수 있게 해 주는 AWS Bedrock 을 호출합니다. 그 호출에 쓸 자격증명은 액세스 키로 들고 있었습니다. 시크릿에 넣어 두고 환경변수로 주입하는 방식이라 파드 안에서는 평문으로 보입니다.

액세스 키는 저절로 만료되지 않으니 한 번 새어 나가면 사람이 알아채고 지울 때까지 계속 유효하고, 어디까지 퍼졌는지도 알 수 없습니다.

그래서 EKS 파드에 액세스 키 없이 IAM 권한을 넘겨주는 IRSA(IAM Roles for Service Accounts)로 바꾸기로 했습니다.

그런데 Bedrock 권한이 EKS 가 있는 계정이 아니라 다른 계정에 있어서 역할이 하나로 안 끝나고 두 개가 필요했습니다.

두 역할의 서로 다른 임무

EKS PodServiceAccount: litellm-salitellm-eks-role진입 지점litellm-bedrock-access-roleBedrock 권한을 쥔 쪽Bedrock APIIRSA 토큰 교환AssumeRole운영 계정GPU 전용 계정
역할 두 개가 서로 다른 계정에

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

IRSA 가 붙었으면 이 둘이 나와야 정상입니다.

AWS_ROLE_ARN
AWS_WEB_IDENTITY_TOKEN_FILE

반대로 이 둘은 하나도 없어야 정상입니다.

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

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

참고

  1. 불러오는 중