📀

AWS CDK route53.HostedZone.fromLookupの挙動が予想外だった話

2022/10/13に公開
const hostedZoneId = route53.HostedZone.fromLookup(scope, "HostedZoneId", {
  domainName: this.domainName,
});

エラー: The specified hosted zone does not exist

とある環境でroute53.HostedZone.fromLookupのメソッドを利用していたのですが、予想外の動きをしました。

状況:

  1. とある環境を、一度すべて壊して再生成できるか試していた
  2. The specified hosted zone does not exist のエラーが表示される
  3. ドメインなどは間違っていない様子だった

route53.HostedZone.fromLookup() とは

https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_aws-route53.HostedZone.html#static-fromwbrlookupscope-id-query

ドキュメントにある通りですが、指定したAWSアカウントの指定したリージョン内にあるRoute53のホストゾーンをクエリ出来るメソッドになっています。

こんな感じで、特定のホストゾーンをクエリし、CDKでRoute53のリソースにアクセスできるようになります。

cdk.context.jsonに情報を保持する

さて、問題の挙動なのですが、route53.HostedZone.fromLookup()は初回実行時にローカルの情報を保持します。

こちらの issue コメントで知ることが出来ました。

https://github.com/aws/aws-cdk/issues/5547#issuecomment-652043664

初回実行後のcdk.context.jsonを見てみると、以下のような情報が格納されていました。

{
  "hosted-zone:account=123456789012:domainName=example.com:region=ap-northeast-1": {
    "Id": "/hostedzone/Z012341234XYZ34ABCD12",
    "Name": "example.com."
  }
}

そして、cdk.context.jsonに情報があれば、AWS側にクエリせずcdk.context.jsonの値を使うようになります。

回避策

cdk.context.jsonの該当箇所を削除して cdk deploy をし直せば大丈夫です。

まとめ

この問題が発生しうるのが、Route53のホストゾーンごと削除したのちに再生成するときなので、発生頻度は多くありませんが、自分が困ったので記事にしました。

Discussion