Route 53 のレコードセット削除で InvalidChangeBatch が発生するときの対処方法

2022.01.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

AWS CLI のchange-resource-record-setsで Amazon Route 53 のレコードセットを削除しています。一部レコードセット削除がInvalidChangeBatchで失敗するのですが、なぜでしょうか。

トラブルシューティングを見るとTTLを一致させる必要があるようですが、エイリアスレコードのためTTLは設定していません。ダミーで指定する値などがあるのでしょうか?

$ aws route53 change-resource-record-sets --hosted-zone-id 123456789ABCD --change-batch file://change-resource-record-sets.json

An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Tried to delete resource record set [name='hato.example.com', type='A', set-identifier='hato-primary'] but the values provided do not match the current values]

どう対応すればいいの?

すべての値が既存のレコードセットと過不足なく一致していることを確認してください。

change-resource-record-sets — AWS CLI 2.4.7 Command Reference

To delete a resource record set, you must specify all the same values that you specified when you created it.

レコードセットを削除する際は、TTLに限らず、登録時に指定したすべての値を過不足なく指定する必要があります。エイリアスレコードの場合は TTL を設定できないため、TTL 以外の値に過不足がないか確認してください。例えば、ヘルスチェックを指定している場合はHealthCheckIdも指定する必要があります。

登録時に指定した値を覚えていません

AWS CLI のlist-resource-record-setsで登録した項目、値を確認できます。

list-resource-record-sets — AWS CLI 2.4.7 Command Reference

# hato.example.com の登録値を確認する場合
$ aws route53 list-resource-record-sets --hosted-zone-id 123456789ABCD --query "ResourceRecordSets[?Name == 'hato.example.com.']"
[
    {
        "Name": "hato.example.com.",
        "Type": "A",
        "SetIdentifier": "hato-primary",
        "Failover": "PRIMARY",
        "AliasTarget": {
            "HostedZoneId": "Z14GRHDCWA56QT",
            "DNSName": "xxx.ap-northeast-1.elb.amazonaws.com.",
            "EvaluateTargetHealth": true
        },
        "HealthCheckId": "123456789-abcd-efgh-ijkl-123456789"
    }
]

上記のハイライト(4〜15行目)部分が、ResourceRecordSetで指定する値(6〜18行目)と一致します。

change-resource-record-sets.json

{
    "Comment": "optional comment about the changes in this change batch request",
    "Changes": [
        {
            "Action": "DELETE",
            "ResourceRecordSet": {
                "Name": "hato.example.com.",
                "Type": "A",
                "SetIdentifier": "hato-primary",
                "Failover": "PRIMARY",
                "AliasTarget": {
                    "HostedZoneId": "Z14GRHDCWA56QT",
                    "DNSName": "xxx.ap-northeast-1.elb.amazonaws.com.",
                    "EvaluateTargetHealth": true
                },
                "HealthCheckId": "123456789-abcd-efgh-ijkl-123456789"
            }
        }
    ]
}

参考資料