도메인 이름과 DNS
Rust 인프라 팀이 소유한 도메인의 모든 DNS 레코드는 AWS Route 53에 호스팅되어 있으며, 팀 구성원이 수정할 수 있습니다. 이 문서에는 팀 구성원이 변경 작업을 수행하는 방법에 대한 안내가 담겨 있습니다.
Terraform으로 관리되는 도메인의 DNS 레코드 변경하기
경고: 아직 모든 도메인 이름이 Terraform으로 관리되고 있지는 않습니다. 콘솔에서 영역(zone)의 설명이
[terraform]으로 시작하지 않는다면 UI에서 직접 변경해야 합니다. 다만 모든 도메인을 Terraform으로 이전하는 작업이 진행 중입니다.
경고:
terraform/services/dns에는 Terraform 외부에서 관리되는 리소스를 가리키는 DNS 레코드의 정의만 들어 있습니다. Terraform이 리소스를 관리하는 경우에는 필요한 레코드를 자동으로 추가합니다. 해당 서비스의 Terraform 구성이 어디에 있는지는 서비스 문서를 참조하십시오.
DNS 레코드는 Terraform 구성의 terraform/services/dns 디렉터리에서 관리합니다. 관리되는 각 도메인마다 도메인 이름을 따서 이름을 붙이고 .tf로 끝나는 파일이 있으며, 이 파일에는 몇 가지 기본 정보와 해당 도메인의 레코드가 들어 있습니다.
이 구성은 A, CNAME, MX, TXT 레코드 추가를 지원합니다. 도메인 파일에 포함된 모듈 정의 안에서 각 레코드 유형은 고유한 맵을 가집니다. 맵의 키는 레코드 이름이며, 값은 레코드 값의 목록입니다.
예를 들어 rust-lang.github.io를 가리키는 pages.rust-lang.org CNAME을 추가하려면 terraform/services/dns/rust-lang.org에 다음 내용을 추가해야 합니다:
module "rust_lang_org" {
# ...
CNAME = {
"pages.rust-lang.org." = ["rust-lang.github.io"],
# ...
}
}
모든 변경을 마쳤다면 다음 명령으로 적용할 수 있습니다:
terraform apply
Terraform으로 새 도메인의 DNS 관리하기
새 도메인 이름의 DNS 레코드를 관리하도록 Terraform을 설정하려면 몇 가지 단계를 거쳐야 합니다. 먼저 Terraform 내부에서 해당 도메인에 사용할 식별자를 정해야 합니다. 관례상 식별자는 도메인 이름에서 .과 -를 _로 바꾼 것입니다. 예를 들어 rust-lang.org는 rust_lang_org가 됩니다.
그런 다음 terraform/services/dns에 도메인 이름을 따서 이름을 붙이고 .tf로 끝나는 파일을 만들어 다음 내용을 넣으십시오(자리 표시자를 반드시 바꾸십시오):
module "<IDENTIFIER>" {
source = "./domain"
domain = "<DOMAIN-NAME>"
comment = "<COMMENT-FOR-THE-DOMAIN>"
ttl = 300
}
마지막으로 Terraform 구성의 다른 부분에서 레코드를 추가할 수 있도록 Route53 영역의 ID를 출력해야 합니다. terraform/services/dns/outputs.tf에 다음 코드 조각을 추가하십시오:
# ...
output "zone_<IDENTIFIER>" {
value = module.<IDENTIFIER>.zone_id
}
작업을 마쳤다면 다음 명령으로 변경 사항을 적용할 수 있습니다:
terraform init
terraform apply
서브도메인 리디렉션 추가하기
Terraform 구성은 우리가 관리하는 임의 개수의 서브도메인에서 하나의 URL로 리디렉션하는 기능을 지원합니다. 리디렉션은 다음 인프라 구성 요소로 만들어집니다:
-
리디렉션 세트마다
rust-http-redirect-<HASH>라는 이름의 S3 버킷이 하나씩 있습니다. 이 버킷은 웹사이트 호스팅이 활성화되어 있고, 들어오는 모든 요청을 선택한 URL로 리디렉션하도록 구성되어 있습니다. 이 방식을 사용하면 별도의 서버 없이 리디렉션을 구현할 수 있습니다. -
리디렉션 세트마다 ACM 인증서(및 이를 검증하기 위한 DNS 레코드)가 하나씩 있으며, 이 인증서에는 모든 소스가 대체 이름으로 포함됩니다. 이 인증서는 HTTPS 리디렉션을 활성화하는 데 사용됩니다.
-
HTTPS 요청을 지원하기 위해 리디렉션 세트마다 CloudFront 배포가 하나씩 있습니다. 이 배포는 앞서 생성한 ACM 인증서를 사용하고 요청을 S3 버킷으로 전달합니다.
-
관련 존에서 각 리디렉션에 대한 Route53 레코드: 서브도메인에는 CNAME, 에이펙스 도메인에는 ALIAS를 사용합니다.
모든 리디렉션은 terraform/redirects.tf에 정의되어 있으며, 대상 URL마다 모듈이 하나씩 있습니다. 새 URL로 리디렉션해야 하면 새 모듈을 만들고, 그렇지 않으면 기존 모듈에 새 서브도메인을 추가하십시오. 다음 예시 모듈을 참고하십시오(플레이스홀더는 반드시 실제 값으로 바꾸십시오):
module "redirect_<IDENTIFIER>" {
source = "./modules/subdomain-redirect"
providers = {
aws = "aws"
aws.east1 = "aws.east1"
}
to = "<DESTINATION-URL>"
from = {
"<SUBDOMAIN-1>" = module.dns.zone_<DOMAIN-1-IDENTIFIER>,
"<SUBDOMAIN-2>" = module.dns.zone_<DOMAIN-2-IDENTIFIER>,
}
}
모든 변경을 마쳤다면 다음 명령으로 구성을 적용할 수 있습니다:
terraform init
terraform apply
CloudFront 배포 변경 사항은 전파 속도가 매우 느리므로, 변경 사항 하나를 배포하는 데 약 15분이 걸린다는 점에 유의하십시오. 또한 기존 리디렉션에 도메인을 추가하거나 제거하면 ACM 인증서를 다시 생성해야 합니다. 따라서 여러 리소스가 다시 생성되더라도 정상입니다.
도메인 이름을 Rust로 이전하기
인프라 팀 구성원은 다음 단계에 따라 도메인 이름을 Rust 프로젝트의 등록 대행자로 이전해야 합니다:
-
해당 도메인 이름을 프로젝트가 소유하려고 하는지 인프라 팀 내부에서 확인하십시오. 더 복잡한 경우에는 이 문제를 리더십 위원회에 올려야 합니다.
-
도메인 이름이 아직 AWS Route 53을 네임서버로 사용하지 않는다면, 도메인의 현재 소유자에게 옮겨야 할 모든 DNS 레코드의 목록을 요청하십시오. 그런 다음 도메인을 이전하기 전에 모든 레코드를 Route 53의 새 호스팅 영역에 추가하십시오. 이 단계에 대한 자세한 내용은 DNS 이전에 관한 아래 섹션을 참고하십시오.
-
이전할 수 있도록 도메인 이름의 잠금을 해제해 달라고 현재 소유자에게 요청하고, 소유자에게서 이전 코드를 받으십시오. 이전 코드는 도메인 이전의 핵심이므로 공개된 커뮤니케이션 플랫폼으로 받지 마십시오.
-
AWS Route 53의 Transfer Domain 섹션으로 이동하여 도메인 이름을 입력하십시오. 오류가 나지 않으면 앞서 받은 이전 코드를 입력하고, 기존 Route 53 호스팅 영역을 사용하도록 선택하십시오. 오류가 나면 어떤 단계가 빠졌는지 자세히 표시됩니다. 호스팅 영역은 올바른 영역으로 자동 완성됩니다. Rust 재단이 출범하기 전까지는 Pietro의 정보를 도메인 연락처로 사용하십시오. 마지막으로 모든 내용을 리뷰하고 이전 절차를 완료하십시오.
-
현재 소유자에게 등록 대행자가 보낼 이메일을 기다려 달라고 알리십시오. 그 이메일에서 링크를 클릭하여 도메인 이름 이전을 확인해 달라고 요청할 것입니다.
-
이전 절차에는 시간이 꽤 걸립니다. 도메인이 이전되었다는 이메일이 admin@rust-lang.org로 오면 작업이 끝납니다! 🎉🎉🎉
DNS 이전하기
대부분의 도메인 이름은 등록 대행자를 DNS 서버로 사용합니다. 그러면 도메인을 다른 곳으로 이전한 뒤에는 기존 등록 대행자도 DNS 트래픽 처리를 중단합니다. 그러므로 실제로 이전 절차를 시작하기 전에 모든 DNS 레코드가 AWS Route 53으로 올바르게 복사되었는지 확인해야 합니다.
현재 도메인 소유자에게 모든 A, AAAA, CNAME, TXT, MX 레코드를 명시적으로 요청하십시오. MX 레코드를 제외한 모든 레코드는 Terraform DNS 구성에 복사해야 합니다(해당 도메인 이름으로 새 파일을 만들고, 다른 도메인 이름의 파일을 참고하십시오).
일부 레코드가 현재 등록 대행자가 제공하는 HTTP 리디렉션 서비스를 참조하고 있다면, 해당 레코드는 도메인 이전이 끝날 때까지 기다려야 합니다. 이전이 완료되면 Terraform에 새 도메인 리디렉션을 추가하십시오. HTTPS 리디렉션용 TLS 인증서를 요청하려면 이 작업은 이전이 끝난 후에 해야 합니다.
도메인에 MX 레코드가 있다면 해당 레코드는 Mailgun으로 이전해야 합니다. Mailgun에 접속하여 해당 도메인 이름을 추가하십시오. 도메인이 US 리전에 있고, 공유 IP를 사용하며, 1024비트 DKIM 키를 사용하는지 확인하십시오(2048비트 키는 AWS Route 53 레코드 하나에 들어가지 않습니다). 그런 다음 추적용 CNAME 레코드를 제외한 모든 레코드를 Terraform DNS 구성에 복사하고, 도메인 이전이 완료될 때까지 기다리십시오. 이전이 완료되면 Mailgun으로 돌아가 해당 도메인의 DNS 설정을 검증하십시오. 마지막으로 팀 저장소의 config.toml에 도메인을 추가하고, 필요한 메일링 리스트를 일반적인 절차에 따라 만드십시오.