Search

AWS 다른 호스트 영역에 하위도메인 구성하는 법

회사에서 EKS Blueprints for Terraform; Blue/Green Migration 패턴으로 클러스터 부트스트랩을 구성하던 중 경험한 이슈와 구성을 정리한다.

environments

패턴의 quick start를 따라하면 제일 먼저 구성하는 것이 enviornments 스택이다. 여기서 terraform.tfvars의 hosted_zone_name 로 생성될 루트 호스트 영역은 테라폼 코드의 바깥 영역으로 미리 구성해두어야 한다(data.aws_route53_zone.root).
도메인 서비스도 쓰기 나름인데 우리 회사에선 Namecheap란 서비스를 사용해서 해당 도메인을 구매해서 네임서버를 NS 레코드의 값으로 채웠다. 이 부분이, 외부 종속성이다 보니, 참고하는 문서에도 없어서 좀 헤맸다(한번 설정하고 관리를 안하는 부분은 매번 새롭다).
사실 이렇게하고 apply만 하면 잘 동작해야 한다. 어떻게 구성된 것인지 살펴보면,

테라폼 코드

# Retrieve existing root hosted zone data "aws_route53_zone" "root" { name = local.hosted_zone_name } # Create Sub HostedZone four our deployment resource "aws_route53_zone" "sub" { name = "${local.name}.${local.hosted_zone_name}" } # Validate records for the new HostedZone resource "aws_route53_record" "ns" { zone_id = data.aws_route53_zone.root.zone_id name = "${local.name}.${local.hosted_zone_name}" type = "NS" ttl = "30" records = aws_route53_zone.sub.name_servers } module "acm" { source = "terraform-aws-modules/acm/aws" version = "~> 4.0" domain_name = "${local.name}.${local.hosted_zone_name}" zone_id = aws_route53_zone.sub.zone_id subject_alternative_names = [ "*.${local.name}.${local.hosted_zone_name}" ] wait_for_validation = true tags = { Name = "${local.name}.${local.hosted_zone_name}" } }
Ruby
복사
회사에서 사용한 값을 그대로 쓰면:
루트 도메인/호스트 영역 = atlas-poc.org
하위 도메인/호스트 영역 = eks-blueprint.atlas-poc.org
위에서 설명한 루트 호스트 영역이, 첫 블록, data.aws_route53_zone.root 이고, 나중에 가중치 라우팅으로 blue/green을 제어할 도메인을 만들, 하위 도메인을 만든다(aws_route53_zone.sub).
그리고 루트 호스트 영역에 하위 도메인에 대한 NS 레코드를 하나 만든다. 이름은 하위 도메인이고 값은 하위 도메인으로 만든 호스트 영역의 네임서버 값을 그대로 써준다.
아래엔 acm 모듈로 ACM도 생성한다. 기본적으로 도메인 DNS 검증을 하기 때문에(DV), 하위 호스트 영역에 CNAME 레코드를 하나 만들게 된다.
그림으로 구성을 표현하면 다음과 같다:
EKS Blueprints for Terraform 원격 저장소의 원본 코드:
사실 이런 구성은 다음 문서의 설명과 같다:
이렇게만 구성하면 하위 도메인으로 인증서 붙이기와 요청이 성공한다.
ACM 인증서의 검증을 기다리지만, 나의 경우 terraform apply timeout 내엔 되지 않았고 그 이후에 성공했다.

습득 교훈

Namecheap 같은 도메인 서비스에 AWS 네임서버를 등록해야 한다는 것을 잊었다. 이 부분 확인하는게 제일 오래 걸렸다. 후에 기억하리라는 보장은 없다. 그래서 기록했다.
왜 하위 도메인을 별도의 호스트 영역으로 구성했을까를 생각해보면, external-dns의 영향을 줄이기 위함일것 같다.
실제로 external-dns “sync” 정책을 쓰다가 DNS 레코드를 날려서 장애가 된 적이 있다.
default가 “upsert-only” 인데엔 이유가 있다.