📖

Route53ホストゾーンを他のアカウントのホストゾーンに移す

に公開

概要

AccountAにあるRoute53ホストゾーンの中身をそのままに、AccountBに移動させたいです。
マニュアルでレコードのファイルを加工する必要があり楽にファイル加工するための手順を残します。

手順

AWSの公式ドキュメントに手順が書いてあることを参考に実施します。
前提

  • jqがインストールされている
    • brew install jq
  1. ソースアカウント(AccountA)のレコードを出力
    # ソースアカウントにログインする
    SOURCE_HOSTZONE=<ソースアカウントのホストゾーン>
    aws route53 list-resource-record-sets --hosted-zone-id $SOURCE_HOSTZONE > records.json
    
  2. ターゲットアカウントでRoute53ホストゾーンを作成する
  3. 出力されたファイルを加工
    • このファイルのままだとimportする用のコマンドが打てないので加工します
    jq '{ Changes: [ .ResourceRecordSets[] | select(.Type != "NS" and .Type != "SOA") | { Action: "CREATE", ResourceRecordSet: . } ] }' records.json > records_import.json
    
    • ルール:NS,SOAレコードは除く, Actionを追加, Changes配下に配列を作成
  4. 加工したファイルをimport
    TARGET_HOSTZONE=<ソースアカウントのホストゾーン>
    aws route53 change-resource-record-sets --hosted-zone-id $TARGET_HOSTZONE --change-batch file://records_import.json
    {
        "ChangeInfo": {
            "Id": "/change/xxxx",
            "Status": "PENDING",
            "SubmittedAt": "2025-01-01T00:00:00.000000+00:00"
        }
    }
    
  5. ターゲットのNSレコードのサーバをドメインに登録する
    • AWSのNSレコードはデフォルトがTTL=172800秒(48時間)のため、変更はTTLが経過した後に反映される
  6. NSレコードが反映されていることを確認
    dig NS <登録ドメイン>
    
  7. ターゲットアカウントのレコードが同一かどうか比較する
    # ターゲットアカウントのレコード出力
    TARGET_HOSTZONE=<ターゲットアカウントのホストゾーン>
    aws route53 list-resource-record-sets --hosted-zone-id $TARGET_HOSTZONE > target_records.json
    diff -u records.json target_records.json
    # NSとSOAレコードの差分のみ出力されることを確認
    
  8. ソースアカウントのホストゾーンを削除する

Discussion