도메인 이름과 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
}
마지막으로 Route53 존의 ID를 출력해야 하며, 이를 통해 우리 Terraform 구성의 다른 부분에서 레코드를 추가할 수 있습니다. 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을, apex 도메인에는 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에 추가하고, 일반적인 절차에 따라 필요한 메일링 리스트를 생성하십시오.