DevOps

EKS에서 파드에 AWS 권한 부여하는 3가지 방법

YoonJong 2026. 5. 10. 20:28
728x90
반응형

요약: 새로 구성하는 EKS 환경에서는 Pod Identity를 기본적으로 사용하는 것이 좋다.

설정이 단순하고 Terraform으로 중앙 관리가 가능하며 AWS의 권장 사항이다.

*단 AWS SDK v1기반은 지원하지 않으니, 예외적으로 IRSA를 사용해야 한다.

 

--

 

EKS에서 pod가 AWS 리소스(s3, MSK 등)에 접근하려면 IAM 권한이 필요하다.

하지만 파드는 EC2처럼 인스턴스 프로파일을 직접 붙일 수 없다.

해당 문제를 해결하기 위해서는 3가지 방법이 있다.

 

가상 선호/최신 방법인 Pod Identity부터 알아보자.

 

Pod Identity (AWS 권장 최신 방식, 2023)

AWS EKS Pod Identity Agent가 파드의 자격증명을 직접 담당한다,

 

OIDC나 SA 어노테이션 없이 Terraform에서 namepsace + SA 조합을 매핑해 사용한다.

*OIDC(OpenID Conenct): "내가 누구야"를 증명하는 프로토콜 

 

이 방법은 언제 사용하냐?

- EKS 1.24 이상 환경

- AWS SDK v2 기반 애플리케이션

- 새로 구성하는 모든 인프라

 

파드 기동 -> eks-pod-identity-agent (DeamonSet)에 자격증명 요청 -> AWS에서 임시 자격증명 발급 -> 파드에 주입

 

설정 방법

# Step1. IAM Role 생성
resource "aws_iam_role" "jenkins" {
  name = "${local.cluster_name}-jenkins"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Service = "pods.eks.amazonaws.com"
      }
      Action = [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }]
  })

  tags = merge(var.common_tags, {
    Name = "${local.cluster_name}-jenkins"
  })
}

--
# Step2. Pod Identity Association 생성
resource "aws_eks_pod_identity_association" "jenkins" {
  cluster_name    = module.eks.cluster_name
  namespace       = "jenkins"
  service_account = "jenkins"
  role_arn        = aws_iam_role.jenkins.arn

  tags = merge(var.common_tags, {
    Name = "${local.cluster_name}-jenkins"
  })

  depends_on = [kubernetes_namespace_v1.jenkins]
}

--
# Step3. Service Account 생성
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: jenkins

 

--

 

두 번째 방법은 IRSA를 사용하는 방법이다. (IAM Roles for Service Account)

EKS의 OIDC Provider를 통해 k8s Service Account와 IAM Role을 1:1 로 연결하는 방식이다.

 

SA에 IAM Role ARN을 어노테이션으로 명시하면, pod 가동 시 EKS가 JWT 토큰을 발급하고 AWS STS가 이를 검증해 임시 자격증명을 제공한다.

파드 기동 -> SA 토큰(JWT) 발급(OIDC provider 서명) -> AWS STS -> IAM Role 자격증명 발급

 

OIDC Provider가 사전에 설정되어 있어야한다.

이 방법은 언제 쓰냐?

- Pod Identity를 지원하지 않는 구형 EKS 버전

- AWS SDK v1 기반을 사용할 경우에는 사용해야함.

 

권장되지 않는 방법이기에 사용 코드는 생략.

 

--

세번째 방법은 Node IAM Role 이다.

EC2 노드 자체에 IAM Role을 부여하고, 그 노드 위에서 실행되는 모든 pod가 동일한 권한을 공유하는 방식이다.

EC2 Node (IAM Role: node-role)
  ├── Pod A  → node-role 권한 사용
  ├── Pod B  → node-role 권한 사용
  └── Pod C  → node-role 권한 사용 (원치 않아도)

 

해당 방법의 장점은 단순하다는 것 밖에 없다.

노드의 기본 운영에 필요한 권한이나 모든 pod가 동일 권한을 가져야하는 단순한 환경에서만 사용할 것으로 예상된다.

 

728x90
반응형