내용으로 건너뛰기

EKS External-DNS Add-on을 Cross Account 형태로 사용하는 방법

4분 분량
콘텐츠 수준: 중급
0

EKS External-DNS를 사용하여 타계정에 있는 DNS의 조회 권한을 부여하려 할 때의 가이드

개요

EKS 클러스터가 위치한 계정과 Route53 Hosted Zone이 위치한 계정이 다른 경우, ExternalDNS add-on을 통해서 DNS를 가져와야 하는 경우가 있습니다. 이럴 때 Cross Account 형태로 구성하여 타 계정의 DNS 레코드를 불러오는 것이 가능합니다. 본 게시글을 이를 진행하기 위한 가이드를 제공합니다.

핵심 원리는 다음과 같습니다:

  1. IRSA를 통해 타 계정의 Role을 수임(AssumeRole)할 수 있도록 권한을 설정합니다.
  2. EKS Add-on의 Optional Configuration(선택적 구성 설정)에서 extraArgs의 aws-assume-role를 사용하여 타 계정의 Role을 수임하도록 지정합니다.

사전 조건

서로 다른 계정을 다음과 같이 정의합니다.

  • EKS 클러스터가 있는 계정 (이하 계정 A, 111122223333)
  • Route53 DNS Record를 소유하고 있는 계정 (이하 계정 B, 444455556666)

각 계정의 필요한 구성 요소는 다음과 같습니다.

  • 계정 A: sts:AssumeRole을 할 수 있는 권한을 지닌 IRSA Role
  • 계정 B: Route53을 관리할 수 있고, Trust Relationship으로 계정 A의 IRSA Role을 지정한 Role

구성 절차

Step 1. 계정 A에서 IRSA Role을 external-dns에 사용할 Service Account에 연결하여 생성합니다.

계정 A에서 AssumeRole을 할 수 있는 policy를 생성합니다.

aws iam create-policy \
  --policy-name AssumeRoleCrossAccount \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AssumeRoleCrossAccount",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::444455556666:role/external-dns-role"
        }
    ]
}'

eksctl을 이용하여 계정 A에서 이를 기반으로 한 ServiceAccount를 생성합니다.

eksctl create iamserviceaccount \
    --name external-dns \
    --namespace external-dns \
    --cluster CLUSTER_NAME \
    --attach-policy-arn arn:aws:iam::111122223333:policy/AssumeRoleCrossAccount \
    --approve

Note: CLUSTER_NAME은 EKS Cluster 이름으로 대체하여 사용합니다.

Step 2. 계정 B에서 Route53 Policy 생성 한 뒤 Role 생성하고 적절한 Trust Relationship을 설정합니다.

계정 B에서 Route53과 관련하여 조작이 가능하도록 Policy를 생성합니다.

aws iam create-policy \
  --policy-name ExternalDNSRoute53Policy \
  --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "route53:ChangeResourceRecordSets",
          "route53:ListResourceRecordSets",
          "route53:ListTagsForResource"
        ],
        "Resource": [
          "arn:aws:route53:::hostedzone/HOSTED_ZONE_ID"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "route53:ListHostedZones"
        ],
        "Resource": ["*"] 
      }
    ]
  }'

Note: HOSTED_ZONE_ID는 관리 대상 Hosted Zone ID로 변경해서 사용해야 하며, route53:ListHostedZones 액션은 리소스 수준 권한(Resource-level permissions)을 지원하지 않으므로 "*"를 지정해야 합니다.

이후 동일한 계정, 계정 B에서 Policy를 연결할 Role을 생성합니다. Trust Relationship에 Step 1에서 eksctl을 통해 만들어진 계정 A의 IRSA Role의 arn을 지정합니다.

aws iam create-role \
  --role-name external-dns-role \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "AWS": "arn:aws:iam::111122223333:role/IRSA-ROLE-NAME"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

Note: IRSA-ROLE-NAME은 Step 1에서 eksctl을 통해 생성된 계정 A의 IRSA Role 이름으로 교체합니다.

계정 B에서 생성한 Role에 Route53 Policy를 연결합니다.

aws iam attach-role-policy \
  --role-name external-dns-role \
  --policy-arn arn:aws:iam::444455556666:policy/ExternalDNSRoute53Policy

Step 3. EKS Add-on으로 External-DNS 배포합니다.

EKS Add-on의 Optional Configuration(Advanced Configuration)에서 extraArgs를 사용하여 계정 B의 Role을 수임하도록 지정합니다.

{
    "extraArgs": [
        "--aws-assume-role=arn:aws:iam::444455556666:role/external-dns-role"
    ]
}

Step 4. 정상적으로 계정 B의 Route53 Hosted Zone 정보를 불러오고 있는지를 확인합니다.

Pod 로그를 통해 정상적으로 Cross Account Role 수임이 이루어지는지 확인합니다.

kubectl logs -n external-dns -l app.kubernetes.io/name=external-dns -f

아래와 같이 Assuming role 로그가 출력되고 레코드가 정상적으로 관리되면 구성이 완료된 것입니다.

time="2026-08-21T05:56:16Z" level=info msg="Created Kubernetes client https://DOMAIN:443"
time="2026-08-21T05:56:17Z" level=info msg="Assuming role: arn:aws:iam::444455556666:role/external-dns-role"
time="2026-08-21T06:00:20Z" level=info msg="Applying provider record filter for domains: DOMAINS"
time="2026-08-21T06:00:20Z" level=info msg="All records are already up to date"
time="2026-08-21T06:00:20Z" level=info msg="Reconciliation succeeded after 4 consecutive soft errors"

필요하다면 추가적으로 도메인을 resolving하여 엔드투엔드 동작을 검증할 수 있습니다.

요약

단계계정작업 내용
Step 1A (EKS)sts:AssumeRole 권한을 가진 IRSA Role 및 ServiceAccount 생성
Step 2B (Route53)Route53 권한을 가진 IAM Role 생성
Step 3A (EKS)extraArgs로 계정 B의 Role ARN 지정하여 EKS Add-on External-dns 배포
Step 4A (EKS)Pod 로그로 Role 수임 및 external dns 정보 불러오는 동작의 정상 여부 확인

참고

  • Route53 Policy의 Resource에는 관리 대상 Hosted Zone만 명시하여 최소 권한 원칙을 준수하는 것을 권장합니다.
  • IRSA 대신 EKS Pod Identity를 사용하는 경우에도 유사한 Cross Account 패턴을 적용할 수 있습니다.
AWS
지원 엔지니어

게시됨 한 달 전62회 조회