🧚‍♀️

AWS CLIでRoute53にCloudfrontのエイリアスレコードを作ろうした時にハマった話

2022/06/28に公開

自分で作ったサイトで描画用のjsなどをCloudfrontで公開していますが、
この時に少々ハマったお話です。
タイトルの通り、AWS CLIでRoute53にCloudfrontのエイリアスレコードを作ろうとした時にエラーの原因がわからずかなり悩みました。

下記のようなjsonファイルを作リました。

sample.json
{
     "Comment": "Creating Alias resource record sets in Route 53",
     "Changes": [{
                "Action": "CREATE",
                "ResourceRecordSet": {
                            "Name": "elb.example.com",
                            "Type": "A",
                            "AliasTarget":{
                                    "HostedZoneId": "ZXXXXXXXXXX",
                                    "DNSName": "xxxxxxxxxxxxx.cloudfront.net",
                                    "EvaluateTargetHealth": false
                              }}
                          }]
}

これを引数にしてコマンドを実行します。

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

ZXXXXXXXXXXはRoute53のホストゾーンIDです。
この時点でコマンドパラメータでホストゾーンIDを指定してるのに、jsonでも指定するのかとは思っていましたが、とりあえず実行。
下記のようなエラーが出ました。

An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Tried to create an alias that targets xxxxxxxxxxxxx.cloudfront.net., type A in zone ZXXXXXXXXXX, but the alias target name does not lie within the target zone, Tried to create an alias that targets xxxxxxxxxxxxx.cloudfront.net., type A in zone ZXXXXXXXXXX, but that target was not found]

どうやら、指定したホストゾーンIDにはxxxxxxxxxxxxx.cloudfront.netがないと言っているようです。
と言われましても・・・
そもそもCloudfrontにホストゾーンIDなんか聞いたことがないので、何のことやら・・・・
ということで、awsの公式ドキュメントをもう一度目を皿のようにして読んだところ・・・ありました!

AWS::Route53::RecordSet AliasTarget

Specify Z2FDTNDATAQYW2. This is always the hosted zone ID when you create an alias record that routes traffic to a CloudFront distribution.

なんと・・・まさかの「固定値」でした。
Cloudfrontを指定する場合はホストゾーンIDは上記値をバチッと書いちゃうのが正解だそうです。

ですから、前述のjsonはこうなります。

sample.json
{
     "Comment": "Creating Alias resource record sets in Route 53",
     "Changes": [{
                "Action": "CREATE",
                "ResourceRecordSet": {
                            "Name": "elb.example.com",
                            "Type": "A",
                            "AliasTarget":{
                                    "HostedZoneId": "Z2FDTNDATAQYW2",
                                    "DNSName": "xxxxxxxxxxxxx.cloudfront.net",
                                    "EvaluateTargetHealth": false
                              }}
                          }]
}

修正したところ正常終了を確認できました。
ホストゾーンIDが固定値なのはCloudfrontがグローバルサービスだからだと思います。
少々分かりづらいので本記事が何かのお役に立てればと思います。

Discussion