IRSA (IAM Roles for Service Accounts)
EKS Pod가 AWS 리소스에 접근할 때 Access Key 없이 IAM Role을 사용할 수 있게 해주는 인증 방식.
왜 필요한가
Pod가 S3, Secrets Manager 같은 AWS 서비스를 호출하려면 자격증명이 필요하다. 가장 단순한 방법은 Access Key를 환경변수로 넣는 것이다. 하지만:
- 키가 이미지나 코드에 포함되면 탈취 위험
- 키 만료/교체 시 모든 Pod를 업데이트해야 함
- Pod별로 권한을 다르게 주기 어려움
IRSA는 이 문제를 해결한다. “이 Pod가 이 클러스터의 이 ServiceAccount로 실행 중이다”는 사실 자체를 신원 증명으로 쓴다.
동작 원리
Pod → kube-apiserver: SA 토큰 요청 (TokenRequest API)
kube-apiserver → Pod: JWT 발급 (클러스터가 서명)
Pod → AWS STS: JWT 제출 (AssumeRoleWithWebIdentity)
STS → OIDC Provider: 서명 검증 ("이 토큰 진짜야?")
OIDC Provider → STS: 검증 완료
STS → Pod: 임시 자격증명 발급 (수십 분 유효)
Pod → AWS 서비스: 임시 자격증명으로 호출
핵심 구성 요소
OIDC Provider: EKS 클러스터를 AWS IAM에 신뢰할 수 있는 토큰 발급자로 등록하는 것. 클러스터 생성 시 자동으로 만들어지지 않는다. 별도로 등록해야 한다.
eksctl utils associate-iam-oidc-provider \
--cluster my-cluster \
--approveServiceAccount 어노테이션: Pod의 ServiceAccount에 사용할 IAM Role ARN을 명시한다.
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-roleIAM Role Trust Policy: 이 클러스터의 이 ServiceAccount만 이 Role을 맡을 수 있도록 조건을 건다.
{
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-2.amazonaws.com/id/XXXX:sub": "system:serviceaccount:namespace:sa-name"
}
}
}임시 자격증명의 수명
STS가 발급하는 임시 자격증명은 보통 1시간 유효하다. SDK(AWS SDK for Go 등)가 만료 전에 자동으로 갱신한다. 갱신은 다시 SA 토큰 → STS 과정을 거친다. SA 토큰 발급이 실패하면 자격증명 갱신도 실패한다.