이전에 HTTPS를 적용하기 위해 AWS 내부에서 도메인을 구매하여 사용 중이었는데, 해당 계정의 프리 티어 기간이 끝나서 현재 작업하고 있는 계정으로 도메인을 이전하려고 한다.
도메인을 구매한 AWS 계정에 로그인 후, Route 53의 등록된 도메인
페이지로 이동한다.
이전하고자 하는 도메인을 선택하고 송신
- 다른 AWS 계정으로 이전
을 선택한다.
도메인 이전 대상 계정의 ID(AWS 콘솔 우측 상단에서 확인 가능)를 입력해주면,
이렇게 암호를 받을 수 있다.
다른 AWS 계정으로부터 도메인을 수신할 AWS 계정에 로그인한다. 요청
페이지에서 아래와 같이 이전 요청이 된 도메인을 확인할 수 있다. 도메인을 이전할 준비가 된 경우 상태는 작업 필요이고 유형은 도메인 내부로 내부 이전이다.
이 요청은 3일 이내에 수락해야 한다. 3일 이내에 이전을 수락하지 않으면 이전 요청이 취소된다.
수락 버튼을 클릭해주고
위에서 도메인 이전 신청 시 받았던 암호를 입력해주면
이렇게 대시보드에서 도메인 이전 진행 중 상태인 도메인을 확인할 수 있다.
AWS 공식 문서에서 제공하는 방법은, CLI 환경에서 프로그래밍 방식으로 호스팅 영역을 마이그레이션 한다. 출발 계정의 호스팅 영역에 레코드를 프로그래밍 방식으로 나열하고 출력을 편집한 다음, 편집된 출력을 사용하여 새 호스팅 영역에 프로그래밍 방식으로 레코드를 생성한다.
나는 위 방식도 사용해보고 AWS 콘솔에서 편집하는 방식도 써봤지만 개인 프로젝트 규모에서는 후자가 편리한 것 같다. 프로그래밍 방식은 이전해야할 호스팅 영역이 많은 팀 이상 단위의 프로젝트에서는 유용하게 사용될 수 있을 것 같다.
여기서는 두 방법에 대해 간단하게 설명해보려고 한다.
만약 나처럼 한 두개의 호스팅 영역만 이전해도 된다면 이 부분을 건너뛰어도 된다.
링크에서 AWS CLI의 설치 관리자를 다운로드 받는다.
aws --version
터미널에서 명령어를 입력하여 설치 확인을 한다.
$ aws configure
AWS Access Key ID [None]: ACCESS_KEY
AWS Secret Access Key [None]: SECRET_KEY
Default region name [None]: ap-northeast-2
Default output format [None]:
출발 계정의 IAM 계정 액세스키와 시크릿 키를 입력하여 설정을 진행한다.
aws route53 list-resource-record-sets --hosted-zone-id hosted-zone-id > path-to-output-file
출발 계정의 이전할 호스팅 영역의 호스팅 영역 ID(Hosted Zone Id)을 복사하여 위의 hosted-zone-id
에 대입한다. path-to-output-file
는 출력할 파일의 이름이다.
aws route53 list-resource-record-sets --hosted-zone-id ZOLDZONE12345 > c:\temp\list-records-ZOLDZONE12345.txt
이와 같이 입력할 수 있다.
{
"Changes": [
{
"Name": "iimad.com.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "52.79.201.55"
}
]
},
{
"Name": "_5ba4f330d5dc1737d80c6804c71f3f0f.iimad.com.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "_5159b702ee907ea23659557ac0fcb2f4.ycvykntjsl.acm-validations.aws."
}
]
},
{
"Name": "api.iimad.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "ZWKZPGTI48KDX",
"DNSName": "dualstack.loadbalancer-https-2052512926.ap-northeast-2.elb.amazonaws.com.",
"EvaluateTargetHealth": true
}
}
]
}
aws 명령어를 사용하여 다운로드 받은 호스팅 영역 파일을 마이그레이션 형식에 맞게 편집해야 한다. 먼저 Type이 SOA 또는 NS인 레코드를 삭제하고, 파일의 두 번째 줄의 ResourceRecordSets를 Changes로 변경한다.
{
"Action": "CREATE",
"ResourceRecordSet": {
<RECORD>
}
}
각 레코드에 대해 위와 같이 Action 및 ResourceRecordSet 요소를 추가한다.
{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "iimad.com.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "52.79.201.55"
}
]
}
},
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "_5ba4f330d5dc1737d80c6804c71f3f0f.iimad.com.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "_5159b702ee907ea23659557ac0fcb2f4.ycvykntjsl.acm-validations.aws."
}
]
}
},
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "api.iimad.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "ZWKZPGTI48KDX",
"DNSName": "dualstack.loadbalancer-https-2052512926.ap-northeast-2.elb.amazonaws.com.",
"EvaluateTargetHealth": true
}
}
}
]
}
최종 결과물은 위와 같을 것이다.
레코드가 많이 있거나 값이 많은 레코드(예: 많은 IP 주소)가 있을 경우 파일을 여러 작은 파일로 분할해야 할 수 있다. 각 파일에는 최대 1,000개의 레코드가 포함될 수 있으며, 모든 Value 요소 값의 최대 길이는 32,000 바이트이다.
나는 이전할 호스팅 영역이 한 개 뿐이므로 이 과정은 생략한다.
도착 계정(호스팅 영역 이전 대상)에서 새 호스팅 영역을 생성한다. 이후 호스팅 영역 ID를 복사한다.
aws route53 change-resource-record-sets --hosted-zone-id id-of-new-hosted-zone --change-batch file://path-to-file-that-contains-records
id-of-new-hosted-zone
에는 도착 계정 호스팅 영역 ID를, path-to-file-that-contains-records
에는 위에서 편집했던 파일의 경로를 대입한다. 나는 로컬의 CLI에서 명령어가 정상적으로 동작하지 않았기 때문에 AWS 콘솔에서 실행할 수 있는 cloudshell을 사용했다.
[cloudshell-user@ip-10-2-114-46 ~]$ aws route53 change-resource-record-sets --hosted-zone-id Z0560123XCDE4YK2J8T0 --change-batch '
> {
> "Changes": [
> {
> "Action": "CREATE",
> "ResourceRecordSet": {
> "Name": "iimad.com.",
> "Type": "A",
> "TTL": 300,
> "ResourceRecords": [
> {
> "Value": "52.79.201.55"
> }
> ]
> }
> },
> {
> "Action": "CREATE",
> "ResourceRecordSet": {
> "Name": "_5ba4f330d5dc1737d80c6804c71f3f0f.iimad.com.",
> "Type": "CNAME",
> "TTL": 300,
> "ResourceRecords": [
> {
> "Value": "_5159b702ee907ea23659557ac0fcb2f4.ycvykntjsl.acm-validations.aws."
> }
> ]
> }
> },
> {
> "Action": "CREATE",
> "ResourceRecordSet": {
> "Name": "api.iimad.com.",
> "Type": "A",
> "AliasTarget": {
> "HostedZoneId": "ZWKZPGTI48KDX",
> "DNSName": "dualstack.loadbalancer-https-2052512926.ap-northeast-2.elb.amazonaws.com.",
> "EvaluateTargetHealth": true
> }
> }
> }
> ]
> }
> '
{
"ChangeInfo": {
"Id": "/change/C07252453ISHIQ8ZFL1LW",
"Status": "PENDING",
"SubmittedAt": "2023-12-03T06:02:33.978000+00:00"
}
}
이렇게 뜨면 정상적으로 마이그레이션이 진행된 것이다. AWS 콘솔에서도 해당 내용들이 새로 추가된 것을 확인할 수 있다.
나처럼 프리티어 기간이 만료되어 새로운 계정으로 이전하는 케이스라면 로드 밸런서와 인증서 등을 모두 새로 생성하고 발급받아야 하기 때문에 이 방식이 훨씬 효율적이다.
프로그래밍 방식과 동일하게 도착 계정에서 호스팅 영역을 생성한다.
새로운 레코드를 생성하여 값에는 서비스할 EC2 인스턴스의 퍼블릭 IP를 넣어준다.
호스팅 영역까지 이전이 완료되었지만 아직 새로운 호스팅 영역이 도메인에 연결되어 있지 않다. 새로운 호스팅 영역을 사용하기 위해서는 호스팅 영역에 속한 네임서버를 도메인에 등록해주어야 한다.
네임서버 레코드는 호스팅 영역과 함께 생성된다. NS 레코드의 도메인 4개를 복사한다.
위에서 복사한 레코드를 이전한 도메인의 네임 서버 편집을 진행한다.
위의 과정을 제대로 따라왔다면 이와 같이 레코드가 총 3개 있을 것이다. 이후 출발 계정의 호스팅 영역은 삭제해도 무관하다.
HTTPS를 사용하기 위해서는 인증 기관의 인증서가 필요한데, AWS에는 이를 무료로 제공한다.
HTTPS 인증서 요청을 하기 전에 AWS의 리전이 제대로 설정되어 있는지 확인해보자. Route 53에서는 글로벌로 설정되어 있었는데, 직후 다른 서비스를 이용하려고 하니 리전이 버지니아 북부로 되어있었다.
AWS의 Certificate Manager
서비스에서 인증서 요청을 한다.
인증서에 등록할 도메인 이름을 입력한다. 나는 현재 진행 중인 프로젝트에서 api.iimad.com, iimad.com 등을 https로 사용하고 싶기 때문에 정규화된 도메인 이름(*.iimad.com
)을 사용할 것이다.
*.{domain_name}
이후 인증서 생성을 마쳤다면 상세 페이지에서 Route 53에서 레코드 생성
버튼을 클릭한다.
자동으로 생성된 레코드 내용을 호스팅 영역에 등록해주자.
여기까지 하면 잠시 후 인증서가 발급된 것을 확인할 수 있을 것이다. (생성한 호스팅 영역의 레코드 개수는 4개가 되었다.) 발급이 되었음에도 갱신 자격이 부적격이라면 하루 정도 기다려보고, 바뀌지 않는다면 정상적으로 레코드를 등록했는지 확인해보자.
만약 정적웹 서비스를 제공하기 위해 S3를 사용한다면 거기서 관련 설정을 진행해주어야 한다. 해당 내용은 여러 블로그에서 확인해볼 수 있다.
로드 밸런서에서 사용하기 위해 보안 그룹 설정을 해줄 것이다.
EC2 인스턴스에서 웹 사이트를 호스팅합니다. 사용자가 HTTP(80) 또는 HTTPS(443)에서 연결하도록 허용하려면 어떻게 해야 하나요?
EC2에서만 사용하고 있는 보안그룹에 인바운드 규칙 HTTP(80)와 HTTPS(443)들을 추가해준다.
로드 밸런싱 - 대상 그룹에서 대상 그룹 생성을 클릭한다. 타입은 인스턴스, 포트 번호는 서버 프로그램에서 사용 중인 번호를 입력한다. 나는 스프링 프로젝트에서 별다른 설정을 하지 않고 사용 중이기 때문에 8080 포트 번호를 입력했다.
대상 그룹을 생성했다면 대상 합계가 0일 것이다. 대상 그룹의 상세 페이지 아래 부분에서 대상을 등록해주어야 한다. 대상 등록 버튼을 클릭하면 위의 사진과 같이 사용 가능한 EC2 인스턴스를 선택 가능하다. 포트는 각자 상황에 맞게 입력하고 아래에 보류 중인 것으로 포함
버튼을 클릭하여 대상을 추가로 등록한다.
네트워크 매핑에서 두 개 이상의 가용 영역을 선택해야 하는데, 여기에 EC2 인스턴스가 실행 중인 가용 영역이 포함될 수 있도록 해주자. 그렇지 않으면 로드 밸런서를 다시 만들거나 추가 요금을 지불해야 할 수 있다.
EC2 인스턴스에서 사용 중인 보안 그룹을 선택한다.
HTTP와 HTTPS 리스너를 설정해주고, 위에서 만들었던 대상 그룹을 선택한다.
보안 리스너에 발급받았던 인증서도 등록한다.
Route 53에서 생성했던 호스팅 영역에 들어가 레코드 생성을 눌러준다. 레코드 이름에 따라 서브 도메인을 만들 수 있다. 관리자 전용 페이지 등을 만들 때도 응용할 수 있을 것 같다.
위 사진처럼 api를 입력했다면 api.iimad.com에 접속하면 HTTPS가 적용된다. 아까 언급했던 것처럼 백엔드 주소로 사용할 것이다.
등록한 도메인에 정상적으로 HTTPS가 적용되었음을 확인할 수 있다.