IRSA 크로스 계정 인증 — EKS Pod의 다른 계정 Bedrock 접근
LLM 게이트웨이는 EKS 에 파드로 떠서 여러 모델을 한 API 로 부를 수 있게 해 주는 AWS Bedrock 을 호출합니다. 그 호출에 쓸 자격증명은 액세스 키로 들고 있었습니다. 시크릿에 넣어 두고 환경변수로 주입하는 방식이라 파드 안에서는 평문으로 보입니다.
액세스 키는 저절로 만료되지 않으니 한 번 새어 나가면 사람이 알아채고 지울 때까지 계속 유효하고, 어디까지 퍼졌는지도 알 수 없습니다.
그래서 EKS 파드에 액세스 키 없이 IAM 권한을 넘겨주는 IRSA(IAM Roles for Service Accounts)로 바꾸기로 했습니다.
그런데 Bedrock 권한이 EKS 가 있는 계정이 아니라 다른 계정에 있어서 역할이 하나로 안 끝나고 두 개가 필요했습니다.
두 역할의 서로 다른 임무
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 를 붙였는데도 예전 키로 동작할 수 있으니, 있어야 할 것만 확인하지 말고 없어야 할 것도 같이 봐야 합니다.
댓글 0