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 \
  --approve

ServiceAccount 어노테이션: Pod의 ServiceAccount에 사용할 IAM Role ARN을 명시한다.

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-role

IAM 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 토큰 발급이 실패하면 자격증명 갱신도 실패한다.

참고