サブドメイン委任で分割した Route 53 パブリックホストゾーンを統合しなおしてみた
いわさです。
Route 53 ホストゾーンでサブドメインを管理する時、別のホストゾーンにサブドメインを委任するケースがよくあると思います。
私も複数のシステムを別の AWS アカウントで管理するために、次のようにサブドメインの委任を行っていました。
しかし、運用環境であればこれが保守性も良さそうなのですが、検証環境だとちょっと話が違ってきまして、Route 53 ホストゾーンの料金はホストゾーンごとに 0.5 USD/月発生します。
非常に軽微ではあるのですが、大量にホストゾーンが作られると無視できない料金になってきます。
そこで、今回サブドメイン委任をしていた検証環境ホストゾーンを、もとのホストゾーンに統合させてみました。
ただ、単純にホストゾーンを削除するだけでなく、委任先で作成したレコードも引っ越します。
結論から言うとワンクリックでポンと移行はできないのですが、AWS CLI を使ってレコードセットをエクスポートし、それを少し修正して統合先のホストゾーンに AWS CLI でインポートすることができます。
公式ドキュメントだと次の手順になります。
今回は検証環境ということもあって、ヘルスチェックを使っていなかったり、TTL などもあまり気にせずやっていますが、上記ドキュメントには運用環境における注意点や追加の手順も紹介されていますので、お試しになる方は上記ドキュメントも併せてご確認ください。
検証してみる
今回は私が所有している検証用ドメインを使ってみます。あまり重要ではないですがそれぞれの AWS アカウントは別れており、サブドメインに NS レコードを指定して別のホストゾーンへ委任している状態です。
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
の中にレコードの配列が含まれている感じです。
{
"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
プロパティで新規作成を指定します。
{
+ "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
側のレコードを確認してみると、別のホストゾーンで作成していたレコードと同じものが作成されていることを確認しました。
あとは TTL などの兼ね合いもあるのですが良きタイミングでtak1wa.com
側の NS レコードの削除と、不要になったホストゾーンを削除します。なお、タイミングについては AWS 公式ドキュメントでは少なくとも 48 時間後と記載されています。
NS レコードの削除はこちらから。
ホストゾーン削除は、NS レコードと SOA レコード以外のレコードを全て先に削除する必要があります。
その後ホストゾーン画面から削除操作を行います。
さいごに
本日はサブドメイン委任で分割した Route 53 パブリックホストゾーンを統合しなおしてみみました。
今回は Route 53 ホストゾーン同士のレコード移行でしたが、要はchange-resource-record-sets
のフォーマットでインポートファイルが用意できれば他の DNS サーバーからのレコード移行も可能なので、この方法は覚えておきたいです。