サブドメイン委任で分割した Route 53 パブリックホストゾーンを統合しなおしてみた

サブドメイン委任で分割した Route 53 パブリックホストゾーンを統合しなおしてみた

Clock Icon2025.06.28

いわさです。

Route 53 ホストゾーンでサブドメインを管理する時、別のホストゾーンにサブドメインを委任するケースがよくあると思います。
私も複数のシステムを別の AWS アカウントで管理するために、次のようにサブドメインの委任を行っていました。

5A1355A0-FB1B-4FD7-B3CA-2D5E6352938F.png

しかし、運用環境であればこれが保守性も良さそうなのですが、検証環境だとちょっと話が違ってきまして、Route 53 ホストゾーンの料金はホストゾーンごとに 0.5 USD/月発生します。
非常に軽微ではあるのですが、大量にホストゾーンが作られると無視できない料金になってきます。

そこで、今回サブドメイン委任をしていた検証環境ホストゾーンを、もとのホストゾーンに統合させてみました。
ただ、単純にホストゾーンを削除するだけでなく、委任先で作成したレコードも引っ越します。

D6627E79-56AA-44DC-B6E1-36908656D578.png

結論から言うとワンクリックでポンと移行はできないのですが、AWS CLI を使ってレコードセットをエクスポートし、それを少し修正して統合先のホストゾーンに AWS CLI でインポートすることができます。
公式ドキュメントだと次の手順になります。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-migrating.html

今回は検証環境ということもあって、ヘルスチェックを使っていなかったり、TTL などもあまり気にせずやっていますが、上記ドキュメントには運用環境における注意点や追加の手順も紹介されていますので、お試しになる方は上記ドキュメントも併せてご確認ください。

検証してみる

今回は私が所有している検証用ドメインを使ってみます。あまり重要ではないですがそれぞれの AWS アカウントは別れており、サブドメインに NS レコードを指定して別のホストゾーンへ委任している状態です。

DC78DE3C-E281-4635-87BB-254F99D30492.png

CA142052-0162-4E2E-80C9-5C7FFFB548CC.png

aad.tak1wa.comのレコードをtak1wa.comホストゾーンに引っ越しし、最終的にaad.tak1wa.comホストゾーンを削除します。

委任先からレコードセットのエクスポート

まずはサブドメイン委任されているホストゾーン(aad.tak1wa.com)のホストゾーン ID を指定してレコードセットを取得します。次のコマンドでローカルに JSON 形式でファイル出力することができます。

% aws route53 list-resource-record-sets --hosted-zone-id Z0981565QA6KFYJIZ676 --profile hogeadmin > hoge_before.json

これでどういう内容が取得できるかというと、次のようにResourceRecordSetsの中にレコードの配列が含まれている感じです。

hoge.json
{
    "ResourceRecordSets": [
        {
            "Name": "aad.tak1wa.com.",
            "Type": "MX",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "10 inbound-smtp.us-east-1.amazonaws.com."
                }
            ]
        },
        {
            "Name": "aad.tak1wa.com.",
            "Type": "NS",
            "TTL": 172800,
            "ResourceRecords": [
                {
                    "Value": "ns-1444.awsdns-52.org."
                },
                {
                    "Value": "ns-874.awsdns-45.net."
                },
                {
                    "Value": "ns-114.awsdns-14.com."
                },
                {
                    "Value": "ns-1879.awsdns-42.co.uk."
                }
            ]
        },
        {
            "Name": "aad.tak1wa.com.",
            "Type": "SOA",
            "TTL": 900,
            "ResourceRecords": [
                {
                    "Value": "ns-1444.awsdns-52.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                }
            ]
        },
        {
            "Name": "aad.tak1wa.com.",
            "Type": "TXT",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "\"v=spf1 include:amazonses.com ~all\""
                }
            ]
        },
        {
            "Name": "_amazonses.aad.tak1wa.com.",
            "Type": "TXT",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "\"4aUQG729zaovliiNdhsIRfGnJlMPsO4Tl/7G/dg5oq8=\""
                }
            ]
        },
        {
            "Name": "_dmarc.aad.tak1wa.com.",
            "Type": "TXT",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "\"v=DMARC1;p=quarantine;pct=100;fo=1\""
                }
            ]
        },
        {
            "Name": "ddkgvuzyn5vujuxcopabeo7y77qnyc6f._domainkey.aad.tak1wa.com.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "ddkgvuzyn5vujuxcopabeo7y77qnyc6f.dkim.amazonses.com."
                }
            ]
        },
        {
            "Name": "lemdze4wfww227mmijc47jsxdomf44aj._domainkey.aad.tak1wa.com.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "lemdze4wfww227mmijc47jsxdomf44aj.dkim.amazonses.com."
                }
            ]
        },
        {
            "Name": "rxww5blq3tv6e7l3txmomgytzpdajryw._domainkey.aad.tak1wa.com.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "rxww5blq3tv6e7l3txmomgytzpdajryw.dkim.amazonses.com."
                }
            ]
        },
        {
            "Name": "autodiscover.aad.tak1wa.com.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "autodiscover.mail.us-east-1.awsapps.com."
                }
            ]
        }
    ]
}

統合先にレコードセットのインポート

続いてインポートを行います。
route53 change-resource-record-setsコマンドを使うことが出来るのですが、残念ながら先ほど出力したレコードセットのファイルをそのままインポートすることは出来ません。

ということで少し修正をしてやる必要があります。
まず、NS レコードと SOA レコードは引っ越す必要がないので、その部分は削除しましょう。
そして、各レコードをChangesというプロパティのリストとして指定します。
さらに各レコードはActionプロパティで新規作成を指定します。

hoge_after.json
{
+    "Comment": "Changes to DNS records for aad.tak1wa.com",
+    "Changes": [
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "aad.tak1wa.com.",
                 "Type": "MX",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "10 inbound-smtp.us-east-1.amazonaws.com."
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "aad.tak1wa.com.",
                 "Type": "TXT",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "\"v=spf1 include:amazonses.com ~all\""
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "_amazonses.aad.tak1wa.com.",
                 "Type": "TXT",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "\"4aUQG729zaovliiNdhsIRfGnJlMPsO4Tl/7G/dg5oq8=\""
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "_dmarc.aad.tak1wa.com.",
                 "Type": "TXT",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "\"v=DMARC1;p=quarantine;pct=100;fo=1\""
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "ddkgvuzyn5vujuxcopabeo7y77qnyc6f._domainkey.aad.tak1wa.com.",
                 "Type": "CNAME",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "ddkgvuzyn5vujuxcopabeo7y77qnyc6f.dkim.amazonses.com."
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "lemdze4wfww227mmijc47jsxdomf44aj._domainkey.aad.tak1wa.com.",
                 "Type": "CNAME",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "lemdze4wfww227mmijc47jsxdomf44aj.dkim.amazonses.com."
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "rxww5blq3tv6e7l3txmomgytzpdajryw._domainkey.aad.tak1wa.com.",
                 "Type": "CNAME",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "rxww5blq3tv6e7l3txmomgytzpdajryw.dkim.amazonses.com."
                     }
                 ]
+            }
         },
         {
+            "Action": "CREATE",
+            "ResourceRecordSet": {
                 "Name": "autodiscover.aad.tak1wa.com.",
                 "Type": "CNAME",
                 "TTL": 300,
                 "ResourceRecords": [
                     {
                         "Value": "autodiscover.mail.us-east-1.awsapps.com."
                     }
                 ]
+            }
         }
     ]
 }

ちょっと面倒ですよね。レコード数が多いと大変だと思いますが頑張ってください。
インポート用のファイルが用意できたら、あとはchange-resource-record-setsで取り込みます。

% aws route53 change-resource-record-sets --hosted-zone-id Z07463711IS7W792VK625 --change-batch file://hoge_after.json --profile hoge
{
    "ChangeInfo": {
        "Id": "/change/C01139128MWUA9OUU6WH",
        "Status": "PENDING",
        "SubmittedAt": "2025-06-20T21:32:04.559000+00:00",
        "Comment": "Changes to DNS records for aad.tak1wa.com"
    }
}

実行後にtak1wa.com側のレコードを確認してみると、別のホストゾーンで作成していたレコードと同じものが作成されていることを確認しました。

1F5239B0-4DC3-4778-B919-D8AA533E4C69.png

あとは TTL などの兼ね合いもあるのですが良きタイミングでtak1wa.com側の NS レコードの削除と、不要になったホストゾーンを削除します。なお、タイミングについては AWS 公式ドキュメントでは少なくとも 48 時間後と記載されています。

NS レコードの削除はこちらから。

69BF00EF-D866-4DC1-9AD6-584AC433375A.png

ホストゾーン削除は、NS レコードと SOA レコード以外のレコードを全て先に削除する必要があります。
その後ホストゾーン画面から削除操作を行います。

1932BD45-0E0B-4A09-BCEE-EFD7FD7EA288.png

さいごに

本日はサブドメイン委任で分割した Route 53 パブリックホストゾーンを統合しなおしてみみました。

今回は Route 53 ホストゾーン同士のレコード移行でしたが、要はchange-resource-record-setsのフォーマットでインポートファイルが用意できれば他の DNS サーバーからのレコード移行も可能なので、この方法は覚えておきたいです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.