この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは!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でやりましょう!