AWS アカウント間のホストゾーン移行とちょっとしたコツ

記事タイトルとURLをコピーする

こんにちは、末廣です。

本ブログは Route53 のホストゾーンを別の AWS アカウントへ移行する手順を公式ドキュメントに沿って実際行ったものをまとめたものとなります。 基本的にはドキュメント通りに進めることで問題なく移行できたのですが、レコードファイルの編集時にちょっとしたコツをいれることでより簡単になったため、主にその部分に注目して参考いただければと思います。

docs.aws.amazon.com

前提条件と大まかな手順

  • 移行前のアカウントを A、移行先のアカウントを B とします。
  • 両 AWS アカウントに マネジメントコンソール、AWS CLI から Route53 操作の権限がある状態であること。
  • 例として移行対象のホストゾーンドメイン名を suehiro.com とします。

ドキュメントにはステップ 10 までありますが、よりシンプルにしています。

  1. アカウント B で新しくホストゾーンを作成
  2. アカウント A から移行対象のレコードファイルを取得
  3. 2 で作成したレコードファイルの編集
  4. 3 のファイルを使用し、アカウント B のホストゾーンへレコードを作成
  5. 作成レコードの確認
  6. ネームサーバの更新
  7. アカウント A からホストゾーンを削除

詳細手順

では順に実行していきます。

1. アカウント B で新しくホストゾーンを作成

移行先の AWS アカウントにて(画像はマネジメントコンソールから作成している例です)パブリックホストゾーンとして同じ名前のホストゾーンを作成します。

ホストゾーンの作成

2. アカウント A から移行対象のレコードファイルを取得

アカウント A のホストゾーンレコードを取得し、account_a.jsonファイルに保存する以下コマンドを実行します。

$ aws route53 list-resource-record-sets --hosted-zone-id <account_a_hosted-zon-id> --profile account_a > account_a.json

3. 2 で作成したレコードファイルの編集

編集と書いていますが、保存した json ファイルをコピーし、編集することをおすすめします。

不要行の削除

まず、最初の 2 行を削除します。

{
    "ResourceRecordSets": [

次に、NS レコードと SOA レコードに関連する行を削除します。

        {
            "Name": "suehiro.com.",
            "Type": "NS",
            "TTL": 172800,
            "ResourceRecords": [
                {
                    "Value": "ns-xxx.awsdns-46.com."
                },
                {
                    "Value": "ns-xxx.awsdns-30.co.uk."
                },
                {
                    "Value": "ns-xxx.awsdns-58.net."
                },
                {
                    "Value": "ns-xxx.awsdns-58.org."
                }
            ]
        },
        {
            "Name": "suehiro.com.",
            "Type": "SOA",
            "TTL": 900,
            "ResourceRecords": [
                {
                    "Value": "ns-xxx.awsdns-46.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                }
            ]
        },
要素の追加

インデントがおそらくメチャクチャな状態ですが気にせずいきましょう。
最初の行に Changes 要素を追加します。

{
    "Changes": [

各レコードについて、Action および ResourceRecordSet 要素を追加します。

ここで Visual Studio Code 等のエディタの置換をうまく使います。(私は Zedというエディタを使用していますが、改行ごと置換できるものであれば大丈夫です )

        },
        {

これを

            }
        },
        {
            "Action": "CREATE",
            "ResourceRecordSet":
            {

これに置換しましょう。(一括変換でよいですが何度も実行しないよう注意してください。) この時点ではおそらく json ファイルを自動精査してくれるエディタを使っている場合はエラーが出ていると思います。

一番はじめのレコードに要素が追加されていないので

{
    "Changes": [
        {
            "Name":

{
    "Changes": [
        {
            "Action": "CREATE", # ここと
            "ResourceRecordSet": { # ここを追加
                "Name":

と修正します。

最後の部分についても括弧の数があっていない状態なので

                {
                    "Value": 
                }
            ]
        }
    ]
}

                {
                    "Value": 
                }
            ]
        }
        }
    ]
}

としてあげれば json ファイルとして正常なものになったと思います。 ファイルとしては問題ないですが、上記のようにインデントが入っていない状態なので、エディタの自動補正機能等を使って調整してあげてください。

注意事項

ドキュメントへも記載がありますが、ホストゾーンに同じホストゾーン内で、他のレコードを参照するエイリアスが含まれている場合はファイルの編集時に気をつける必要があります。 例えば、以下の様なレコードがあった場合です。

            "ResourceRecordSet": {
                "Name": "alias.sehiro.com.",
                "Type": "A",
                "AliasTarget": {
                    "HostedZoneId": "xxx",
                    "DNSName": "alias-target.sehiro.com",
                    "EvaluateTargetHealth": false
                }
            }

alias.sehiro.com レコードが同じsuehiro.comホストゾーン内の alias-target.sehiro.comを参照しています。 この時、ホストゾーン ID を、新しく作成したホストゾーンの ID に変更し、(アカウント A ▶ アカウント B)エイリアスレコードをファイルの末尾に移動(alias.suehiro.comレコードが alias-target.sehiro.comレコードよりも後に)しましょう。

これを行わないと、aws route53 change-resource-record-sets 実行時に以下エラーが出力されます。

An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Tried to create an alias that targets ...

4. 3 のファイルを使用し、アカウント B のホストゾーンへレコードを作成

1 で作成したホストゾーンの ID を <account_b_hosted-zon-id> に入れ、上記で編集した json ファイル名をaccount_a-edit.jsonとし、以下コマンドを実行します。

$ aws route53 change-resource-record-sets --hosted-zone-id <account_b_hosted-zon-id> --change-batch file://account_a-edit.json --profile account_b

5. 作成レコードの確認

作成したレコードが正しいか、比較し確認します。

$ aws route53 list-resource-record-sets --hosted-zone-id <account_b_hosted-zon-id> --output json --profile account_b > account_b.json

比較元は 2 で保存した account_a.json であり、以下画像ではDevToys を使って比較しています。

レコードファイルの比較

NS レコードと SOA レコードの部分のみ差分が出ている状態であれば問題なく移行が完了しています。

6. ネームサーバの更新

マネジメントコンソールからドメインを管理しているアカウント(今回だとアカウント A)のドメインからネームサーバの編集を行います。それぞれの値に新しく作成した アカウント B での NS レコードの値を入力します。

ネームサーバの更新

7. アカウント A からホストゾーンを削除

新しいホストゾーンのネームサーバーを使用するようにドメイン登録を更新してから少なくとも 48 時間は、古いホストゾーンもこのホストゾーン内のレコードも削除しないでください。DNS リゾルバーがそのホストゾーンのレコードの使用を停止する前に古いホストゾーンを削除した場合、リゾルバーで新しいホストゾーンの使用を開始するまでドメインはインターネットで利用できないおそれがあります。

とあるので、48時間経過してからホストゾーンの削除を実施します。

ホストゾーンを削除する前に NS レコードと SOA レコード以外のレコードをすべて削除します。 ドキュメントには CLI で実行していますが、マネジメントコンソールからでもレコードを一括で選択できるので、すべてを選択するチェックボックスを押下し、NS レコードと SOA レコードのチェックを外すことで一括で(ページをまたぐ場合は数回)削除することができます。

レコードの削除

レコードの削除が完了後、ホストゾーン自体の削除が可能になるので、ゾーンの削除から実施することでホストゾーンの削除まで完了です。

まとめ

Route53 のホストゾーンを別の AWS アカウントに移行する手順を具体例の提示をしながらブログとしてまとめました。自分自身置換部分や文字のみではやや理解しにくかった部分などがあったので、みなさまの作業や検証時の参考になれば幸いです。

末廣 満希(執筆記事の一覧)

2022年新卒入社です。ここに何かかっこいい一言を書くことができるエンジニアになれるように頑張ります。