EKS External-DNS를 사용하여 타계정에 있는 DNS의 조회 권한을 부여하려 할 때의 가이드
개요
EKS 클러스터가 위치한 계정과 Route53 Hosted Zone이 위치한 계정이 다른 경우, ExternalDNS add-on을 통해서 DNS를 가져와야 하는 경우가 있습니다.
이럴 때 Cross Account 형태로 구성하여 타 계정의 DNS 레코드를 불러오는 것이 가능합니다.
본 게시글을 이를 진행하기 위한 가이드를 제공합니다.
핵심 원리는 다음과 같습니다:
- IRSA를 통해 타 계정의 Role을 수임(AssumeRole)할 수 있도록 권한을 설정합니다.
- 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 1 | A (EKS) | sts:AssumeRole 권한을 가진 IRSA Role 및 ServiceAccount 생성 |
| Step 2 | B (Route53) | Route53 권한을 가진 IAM Role 생성 |
| Step 3 | A (EKS) | extraArgs로 계정 B의 Role ARN 지정하여 EKS Add-on External-dns 배포 |
| Step 4 | A (EKS) | Pod 로그로 Role 수임 및 external dns 정보 불러오는 동작의 정상 여부 확인 |
참고
- Route53 Policy의
Resource에는 관리 대상 Hosted Zone만 명시하여 최소 권한 원칙을 준수하는 것을 권장합니다.
- IRSA 대신 EKS Pod Identity를 사용하는 경우에도 유사한 Cross Account 패턴을 적용할 수 있습니다.