【小ネタ】Route53のレコードをCLIから変更する際のDELETE/CREATEの動き

2019.11.15

はじめに

こんにちは!AWS事業本部の島川です。

まず、Route53のレコードの更新をCLIから行う場合、aws route53 change-resource-record-setsコマンドのUPSERTアクションとDELETE/CREATEアクションを組み合わせた方法2種類あります。

基本的にUPSERTでやりたいところですが、更新できないパターンがいくつかあります。

  • Aレコード → CNAMEレコードのようなレコードのタイプを変更するもの
  • Aレコード → Aレコードでもルーティングポリシーを変更などの変更

そういった場合にDELETE/CREATEを使います。ただ、DELETEはOKだったけどCREATEで失敗したらどうなってしまうのか?という疑問があったので実際に確認しました。 結論からいうと削除してから作成するといった動きに見えますが、実際にはUPSERTと同じ動きをします。消えてしまうなどといったことは起きませんでした。

補足:aws route53 change-resource-record-setsコマンドのアクションについて

  • CREATE レコード作成
  • DELETE レコード削除
  • UPSERT レコード更新

aws route53 change-resource-record-setsコマンドの使い方については下記ドキュメントが参考になります。 AWS CLI を使用して Amazon Route 53 でシンプルなリソースレコードセットを作成する方法を教えてください。

それでは確認していきます!

環境

事前にRoute53に「uho.local」というドメインのプライベートホストゾーンを登録しました。

その中の「test.uho.local」レコードが今回の変更対象になります。

やってみる

UPSERTで更新をしてみる

AレコードからAレコード等のシンプルな変更についてはUPSERTでOKです。

UPSERT成功パターン

Aレコード→Aレコードの変更です。

  • sample.jsonの中身
{
"Comment": "CREATE/DELETE/UPSERT test",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.2"
}
]
}
}
]
}
  • コマンド
$ aws route53 list-resource-record-sets --hosted-zone-id **************
###省略###
"Name": "test.uho.local.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.1"
}
]
###省略###
$ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample.json
{
"ChangeInfo": {
"Id": "/change/**************",
"Status": "PENDING",
"SubmittedAt": "2019-11-15T09:28:44.906Z",
"Comment": "CREATE/DELETE/UPSERT test"
}
}
  • 確認
$ aws route53 get-change --id /change/**************
{
"ChangeInfo": {
"Id": "/change/**************",
"Status": "INSYNC",
"SubmittedAt": "2019-11-15T09:28:44.906Z",
"Comment": "CREATE/DELETE/UPSERT test"
}
}
$ aws route53 list-resource-record-sets --hosted-zone-id **************
###省略###
"Name": "test.uho.local.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.2"
}
]
###省略###

問題なく実施できました。

UPSERT失敗パターン

Aレコード→CNAMEレコードの変更です。

  • sample_cname.jsonの中身
{
"Comment": "CREATE/DELETE/UPSERT test",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "test_1.uho.local"
}
]
}
}
]
}
  • コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample_cname.json

An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [RRSet of type CNAME with DNS name test.uho.local. is not permitted as it conflicts with other records with the same DNS name in zone uho.local.]

失敗しました。

DELETE/CREATEで更新をしてみる

UPSERTで失敗したJSONをDELETE/CREATE用に書き直します。

変更前(DELETE)と変更後(CREATE)の情報を記載します。

  • sample2.jsonの中身
{
"Comment": "CREATE/DELETE/UPSERT test",
"Changes": [
{
"Action": "DELETE",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.2"
}
]
}
},
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "test_1.uho.local"
}
]
}
}
]
}
  • コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id *************** --change-batch file://sample2.json
{
"ChangeInfo": {
"Id": "/change/**************",
"Status": "PENDING",
"SubmittedAt": "2019-11-15T09:28:44.906Z",
"Comment": "CREATE/DELETE/UPSERT test"
}
}
  • 確認
$ aws route53 list-resource-record-sets --hosted-zone-id **************
###省略###
"Name": "test.uho.local.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "test_1.uho.local"
}
]
###省略###

できました。

DELETEの後のCREATEで失敗したらどうなる?

本題です。Aレコード→CNAMEレコードの変更で、Type AのままでCNAMEに変え忘れた!という想定でやってみます。

  • sample3.json
{
"Comment": "CREATE/DELETE/UPSERT test",
"Changes": [
{
"Action": "DELETE",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.2"
}
]
}
},
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "test.uho.local",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "test_1.uho.local"
}
]
}
}
]
}
  • コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id ************** --change-batch file://sample3.json

An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Invalid Resource Record: FATAL problem: ARRDATAIllegalIPv4Address (Value is not a valid IPv4 address) encountered with 'test_1.uho.local']
  • 確認
$ aws route53 list-resource-record-sets --hosted-zone-id **************
###省略###
"Name": "test.uho.local.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "10.0.0.2"
}
]
###省略###

失敗しても変更はされておらずそのままでした。

さいごに

UPSERT失敗したらDELETE/CREATEでやりましょう!