AWS 라우트53, 다른 계정으로 호스팅 영역 DNS 레코드 이전하기

들어가며: 라우트53 도메인(Domain)과 호스팅 영역(Hosted Zone)

이전 글에서는 AWS 라우트53에 등록된 도메인을 다른 계정으로 마이그레이션해보았습니다. 라우트53에서는 도메인 뿐만아니라, 도메인에 연결된 DNS를 관리하는 호스팅 영역(Hosted Zone)이 별도로 존재합니다. 도메인과 호스팅 영역을 함께 관리하는 경우 도메인을 이전하더라도 호스팅 영역은 자동으로 이전되지 않습니다. 따라서 호스팅 영역도 이전하고자 하는 경우 별도의 작업이 필요합니다.

라우트53 호스팅 영역을 이전하는 방법에 대해서는 공식 문서에 자세히 설명되어 있습니다.

하지만 막상 문서를 보면 이해하기 어려운 부분들이 있어서 직접 호스팅 영역을 옮겨보면서, 다른 AWS 계정으로 호스팅 영역을 옮기는 방법을 핵심만 소개해보고자 합니다(단, 이 글에서 다루는 마이그레이션 사례는 레코드가 적은 비교적 단순한 경우입니다. 대규모 마이그레이션 작업이 필요한 경우 문서를 꼭 숙지하시고 마이그레이션 작업을 진행하시기 바랍니다).

호스팅 영역 마이그레이션 과정 3단계

이번에도 5555555566 계정에 등록된 44bits.tv의 호스팅 영역을 66666666677 계정으로 이전한다고 가정해보겠습니다. 이미 도메인은 이전 글에서 이전하였으므로 호스팅 영역만 이전하면 됩니다. 안타깝게도 기존 데이터를 자동적으로 마이그레이션하는 기능은 제공되지 않습니다. AWS 공식 문서에서 소개하는 호스팅 영역 마이그레이션 방법을 간략히 정리해보면 다음과 같습니다.

  1. 스텝1: 기존 호스팅 영역에 등록된 데이터를 추출하고 마이그레이션 가능하도록 수정
  2. 스텝2: 새로운 호스팅 영역 생성 및 편집한 DNS 레코드 등록
  3. 스텝3: 라우트53 도메인에 새로운 네임서버 등록

그럼 간단한 한 단계 씩 진행해보겠습니다.

스텝 1: 기존 호스팅 영역에 등록된 데이터를 추출하고 마이그레이션 가능하도록 수정

먼저 기존에 5555555566 계정에 속한 호스팅 영역의 데이터를 list-resource-record-sets로 추출하고, json 형식으로 저장합니다. <HOSTED_ZONE_ID>에는 마이그레이션하고자 하는 호스팅 영역의 ID를 지정합니다.

$ aws route53 list-resource-record-sets --hosted-zone-id <HOSTED_ZONE_ID> > output-old.json

output-old.json 파일의 내용은 대략적으로 다음과 같습니다.

{
    "ResourceRecordSets": [
        {
            "Name": "44bits.tv.",
            "Type": "A",
            ...
        },
        {
            "Name": "44bits.tv.",
            "Type": "NS",
            ...
        },
        {
            "Name": "44bits.tv.",
            "Type": "SOA",
            ...
        },
        {
            "Name": "_a3db5a54bbc7f56fe4563b12c423e3e2f.44bits.tv.",
            "Type": "CNAME",
            ...
        },
        {
            "Name": "www.44bits.tv.",
            "Type": "A",
            ...
        },
        {
            "Name": "_ba5a989238eadfe4563b12c42ebbe4.www.44bits.tv.",
            "Type": "CNAME",
            ...
        }
    ]
}

기존 호스팅 영역에는 6개의 레코드가 등록되어있는 것을 과인할 수 있습니다. 레코드들은 각각 A 레코드 2개, CNAME 레코드 2개, SOA 레코드 하나, NS 레코드 하나입니다.

그럼 마이그레이션 작업을 위해 바로 편집 들어갑니다. 나중에 비교를 위해 기존 파일을 남겨둡니다.

$ cp output-old.json create-records.json

마이그레이션할 내용은 create-records.json을 편집해서 준비합니다. 파일의 두 번째 줄의 ResourceRecordSetsChanges로 변경해줍니다. 그리고 TypeSOA 혹은 NS인 레코드를 삭제합니다. 이제 A 레코드 2개와 CNAME 레코드 2개만 남았습니다.

{
    "Changes": [
        {
            "Name": "44bits.tv.",
            "Type": "A",
            ...
        },
        {
            "Name": "_a3db5a54bbc7f56fe4563b12c423e3e2f.44bits.tv.",
            "Type": "CNAME",
            ...
        },
        {
            "Name": "www.44bits.tv.",
            "Type": "A",
            ...
        },
        {
            "Name": "_ba5a989238eadfe4563b12c42ebbe4.www.44bits.tv.",
            "Type": "CNAME",
            ...
        }
    ]
}

다음으로 Changes 배열의 각 레코드의 내용을 다음 형태로 감싸줍니다.

{
    "Action": "CREATE",
    "ResourceRecordSet": {
        <RECORD>
    }
}

마이그레이션을 위한 최종적인 결과물은 다음과 같습니다. 뒤에서 살펴보겠지만, 이 내용을 마이그레이션에 사용합니다.

{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "44bits.tv.",
        "Type": "A",
        ...
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "www.44bits.tv.",
        "Type": "A",
        ...
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_a3db5a54bbc7f56fe4563b12c423e3e2f.44bits.tv.",
        "Type": "CNAME",
        ...
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_ba5a989238eadfe4563b12c42ebbe4.www.44bits.tv.",
        "Type": "CNAME"
        ...
      }
    }
  ]
}

스텝2: 새로운 호스팅 영역 생성 및 편집한 DNS 레코드 등록

이제 66666666677 계정에서 작업할 차례입니다. 먼저 라우트53의 호스팅 영역 메뉴에서 44bits.tv 호스팅 영역을 새로 만듭니다. TypePublic Hosted Zone을 선택하고 Create를 클릭합니다. 이전 계정에 호스팅 영역이 있더라도 충돌은 일어나지 않습니다.

새로운 호스팅 영역을 만듭니다.

새로 만든 호스팅 영역의 ID를 기록해둡니다. 이제 앞서 수정한 파일로 마이그레이션을 진행할 차례입니다. change-resource-record-sets 명령어로 기존 레코드를 마이그레이션합니다. --hosted-zone-id에는 새로 만든 호스팅 영역 아이디를 지정해줍니다. --change-batch에는 앞서 수정한 마이그레이션 파일 create-records.json을 지정합니다.

$ aws route53 change-resource-record-sets --hosted-zone-id <NEW_HOSTED_ZONE_ID> --change-batch file://create-records.json
{
    "ChangeInfo": {
        "Id": "/change/C0873240R8EB5K6D1ZCR",
        "Status": "PENDING",
        "SubmittedAt": "2020-06-29T16:52:07.828000+00:00"
    }
}

생성 후 StatusPENDING으로 나오지만 레코드 개수가 많지 않으면 금방 완료됩니다. 다른 에러가 발생되지 않았다면 마이그레이션은 이걸로 끝입니다!

이제 마이그레이션이 잘 되었는지 기존 레코드와 새로운 레코드를 비교해볼 차례입니다. list-resource-record-sets 명령어로 새로운 호스팅 영역의 레코드들을 저장하고, 기존 output-old.json의 내용과 비교해봅니다.

$ aws route53 list-resource-record-sets --hosted-zone-id <NEW_HOSTED_ZONE_ID> > output-new.json

# diff로 기존 레코드와 새로운 레코드를 비교해봅니다.
$ diff output-old.json output-new.json

출력 결과에 NS 레코드와 SOA 레코드 차이만 나오면 정상적으로 마이그레이션에 성공한 것입니다.

스텝3: 라우트53 도메인에 새로운 네임서버 등록

하지만 아직 새로운 호스팅 영역이 도메인에 연결되어있지는 않습니다. 새로운 호스팅 영역을 사용하려면 호스팅 영역에 속한 네임서버를 도메인에 등록해주어야합니다.

네임서버 레코드는 호스팅 영역과 함께 자동적으로 생성됩니다. NS 레코드의 도메인 4개를 복사해둡니다. 이제 등록된 도메인(Registered domains) 메뉴에서 도메인 상세 정보 페이지로 이동합니다. 네임서버 아래에 있는 Add or Edit name serverls를 클릭하면 네임 서버 변경을 위한 팝업이 나타납니다.

도메인에 연결된 네임서버 변경 작업을 진행합니다.

여기에 새로운 호스팅 영역의 네임서버 정보를 입력하고 저장합니다. 네임 서버 변경까지는 조금 시간이 걸립니다. 네임 서버 변경 결과는 다음 명령어로 확인해볼 수 있습니다.

$ dig @8.8.8.8 +short NS 44bits.tv

변경된 네임서버 주소가 나타나면, 마이그레이션 성공입니다.

왜 굳이 도커(컨테이너)를 써야 하나요? - 컨테이너를 사용해야 하는 이유

🗒 기사, 2019-01-14 - 컨테이너는 서버 애플리케이션을 배포하고 서버를 운영하는 표준적인 기술이 되어가고 있습니다. 하지만 처음 사용해본다면 그 장점이 잘 와닿지 않을 수도 있습니다. 왜 굳이 도커 컨테이너를 사용해야할까요? 이 글에서는 눈송이 서버를 넘어 컨테이너가 애플리케이션 배포와 운영에 있어 어떤 장점이 있는지 알아봅니다.

허브(Hub)를 사용해 명령행해서 깃허브(GitHub) 풀리퀘스트 보내기

🗒 기사, 2013-12-29 - 깃허브(GitHub)는 깃(Git) 저장소를 원격에서 관리할 수 있게 도와줍니다. 깃허브에서는 깃허브의 기능을 커맨드라인에서 구현한 허브(Hub)라는 도구를 제공하고 잇습니다. 이 글에서는 허브를 사용해 깃허브 저장소를 만들고 풀리퀘스트를 보내는 방법을 소개합니다.

Algo로 개인 VPN 서버 구축하기(요약판)

🗒 기사, 2020-04-05 - Algo는 클라우드에 쉽게 설치해서 사용할 수 있는 개인용 VPN 서버입니다. 이 글에서는 아마존 라이트세일에 VPN 서버를 셋업하는 방법을 요약해서 소개합니다.