Distribution間でドメイン名を移行する

2022-06-27

ドメイン名をあるCloudFront Distributionから別のDistributionに移動しました。 このブログ投稿はドメイン名の移動で気づいたことを紹介します。

背景

前回のブログ投稿で書いたとおり、Amazon CloudFront Distributionをこのウェブサイトのコンテンツを配信するのに使っています。 またこのウェブサイトに関するDNSレコードの管理にはAmazon Route 53を使っています。

現在のCloudFront Distributionの前に古い別のDistributionをドメイン名codemonger.ioに関連づけていました。 以前のDistributionは生のAWS CloudFormationテンプレートで記述していましたが、新しいDistributionを書くのにAWS Cloud Development Kit (CDK)でやり直しました。

新しいCDKスタックを最初にデプロイしようとしたとき、以下のエラーメッセージで失敗しました。

One or more of the CNAMEs you provided are already associated with a different resource.

こちらの記事によると、古いCloudFront Distributionから新しいDistributionにドメイン名を移動させなければならないということでした。

このブログ投稿は私の課題に特化したトピックのみをカバーしています。 他の一般的なトピックについては「参考」節にリストされているリンクを参照してください。

課題

Amazonのドキュメントはドメイン名を2つのCloudFront Distribution間で移動する方法を説明してくれていますが、以下の私の2つの疑問に対する答えを見出すことができませんでした。

  1. ドキュメントのステップはApex(ルート)ドメイン名に対しても機能するのか?
  2. Route 53のAレコードをいつ置き換えるべきか?

CDKスタックの設定でも課題がありました。

疑問1: ドキュメントのステップはルートドメイン名に対しても機能するのか?

答えは 「はい」 です。

私が移動したかったドメイン名codemonger.ioはルートドメインです。 ドメイン名の移動についてググっていると、こちらの記事を見つけました。 記事によると、AWS Supportの力を借りないとルートドメインは移動できないようです*。 幸いこれは古い情報でAmazonのドキュメントにはAWS Supportなしでも可能であるとはっきり書いてあります。

Use the associate-alias command in the AWS CLI to move the alternate domain name. This method works for all same-account moves, including when the alternate domain name is an apex domain (also called a root domain, like example.com). For more information, see Use associate-alias to move an alternate domain name.

それでもよく分からなかったのはドメイン所有の事実を示すために必要なDNSのTXTレコードにどのような名前をつけたらよいかということでした。 Amazonのドキュメントに例示されているドメインはルートドメインではなくwww.example.comというサブドメインであり、TXTレコードの名前は_www.example.comだったからです。 こちらの記事から察して、以下のDNSレコードを試しました。

  • name: _.codemonger.io
  • type: TXT
  • value: dexample123456.cloudfront.net (例示です)
  • TTL: 300
  • policy: simple routing

上記のTXTレコードを追加した後、associate-aliasコマンドは成功してcodemonger.ioは新しいCloudFront Distributionからコンテンツを配信し始めました。

* 後で記事には補足があったことに気づきました。

疑問2: Route 53のAレコードをいつ置き換えるべきか?

答えは associate-aliasコマンドを実行した後」 です。

associate-aliasコマンドのドキュメントによると

With this operation you can move an alias that’s already in use on a CloudFront distribution to a different distribution in one step. This prevents the downtime that could occur if you first remove the alias from one distribution and then separately add the alias to another distribution.

2つの操作(エイリアスの削除と追加)を1つにするということは分かりました。 しかし、Route 53のAレコードとAAAAレコード(まとめてAレコード)をいつ置き換えたらよいかというのははっきりしませんでした。 もしAレコードを古いCloudFront Distributionを指したままにしておくと、Route 53はcodemonger.ioに対するトラフィックを古いDistributionにルーティングし続けてしまうのではないかと考えました。 これだとAレコードを新しいDistributionを指すように変えるまで結局ダウンしてしまいそうでした。 ということでAレコードのRouting PolicyをMultivalue Answer Routingに設定してみようとしましたが、Multivalue AnswerのAレコードをCloudFront Distributionを指すようにはできませんでした*。 結局、Aレコードを更新せずにassociate-aliasを試すことにしました。 なんにせよ私のウェブサイトには大してトラフィックはありません・・・

associate-aliasを実行した後、codemonger.ioに対するトラフィックは新しいDistributionにルーティングされ始めました。 どうやらassociate-aliasは古いDistributionに対するトラフィックを新しいDistributionに転送するということもやってくれるようです。

* 代わりにIPアドレスを指定すべしと怒られました。

CDKで新しいCloudFront Distributionを確保する

associate-aliasコマンドを実行するため、新しいCloudFront Distributionにはcodemonger.ioの有効なSSL/TLS証明書*を設定しつつドメイン名は空欄にしておく必要がありました。 残念ながら、CDKのDistributionはSSL/TLS証明書を設定しつつドメイン名を空欄にしておくということを許してくれませんでした。 ということで回避策として以下のステップを踏みました。

  1. CDKスタックをSSL/TLS証明書とドメイン名なしでCloudFront Distributionを確保するように設定する。
  2. CDKスタックをデプロイする。
  3. AWS Consoleでcodemonger.ioのSSL/TLS証明書を新しいDistributionに設定する。ただしドメイン名は空欄にしておく。
  4. ドメイン名を古いDistributionから新しいDistributionに移動する。
  5. CDKスタックをSSL/TLS証明書とドメイン名ありでCloudFront Distributionを確保するように設定する。

スクリプトを編集せずにステップ1と5の間で挙動を切り替えられるようCDKコンテキストを導入しました。

CDKスタックのスクリプトはGitHubレポジトリで入手できます。

* 私のSSL/TLS証明書はAWS Certificate Managerから取得しました。

参考

Amazon Route 53, AWS Certificate Manager, Amazon CloudFrontに関する一般的なトピックについては以下のドキュメントをご参照ください。