はじめに
CI部 平野です。 既存のCloudFrontディストリビューションから、新規に作成したディストリビューションへ代替ドメインを切り替えることがAPIで簡単にできるようになったようだったので試してみました。
背景
案件で使用中のCloudFrontディストリビューションのオリジンを「ELB+EC2」構成から「S3」構成へ変更する必要があり、ファーストステップとして新規S3オリジンの検証用として別途CloudFrontディストリビューションを作成し検証を行っていました。
そして検証完了後、CloudFrontを切り替えるための方法としてざっくりと次の2案を考えました。
1: 新規に作成したCloudFrontディストリビューションの代替ドメインを付け替えて切り替える
2:既存のCloudFrontディストリビューションの設定を変更して切り替える
案件では諸般の事情により案2の設定変更で切り替えたのですが、調べてみると案1のCloudFrontディストリビューションの代替ドメイン名の切り替えは条件次第ではCLIで実行でき、代替ドメイン名切り替えに発生するダウンタイムも防げることが分かりました。 ご存じの方も多いと思いますが、CloudFrontのディストリビューションに代替ドメイン名を追加しようとしても、別のディストリビューションで既にその代替ドメイン名が使用されている場合は、CNAMEの重複エラーが発生し失敗してしまいます。そのため、APIで簡単に切り替えが実行できる手順を今後の運用に入れられるのではと考え、検証環境で試してみました。
CloudFrontディストリビューションの代替ドメイン名を移動する
以下のドキュメントに記載があります。2021年7月より新たにAPIで代替ドメイン名 (CNAME) を移動できる機能が追加されました。 APIで切り替えることのできる条件は下記の2点のどちらかの場合のみです。
ソースディストリビューションとターゲットディストリビューションが同じAWSアカウントにある場合
ソースディストリビューションとターゲットディストリビューションが異なるAWSアカウントにあるが、ターゲットディストリビューションの状態が無効になっている場合
代替ドメイン名 (CNAME) を追加することによるカスタム URL の使用 - Amazon CloudFront
今回は切り替え元となるソースディストリビューションと切り替え先のターゲットディストリビューションが同一AWSアカウント内にあるため、条件に当てはまりました。
前準備のため用意した環境
先ほどと同じような構成を検証環境で用意しています。
CloudFront①には「ELB+EC2」をオリジンに指定して、代替ドメイン名として「nehibloblg.tk」というドメインを設定しました。
この状態で「nehibloblg.tk」へブラウザからアクセスすると下記のように表示されることを確認。別途EC2上に配置したindex.htmlファイルが表示されています。
また、CloudFront②を別途作成し、こちらはオリジンにS3を指定しました。(実環境に合わせるためオリジンはS3にしています)こちらのS3上にも「index.html」ファイルを配置し、CloudFront②経由でアクセスすることで下記のように表示されることも確認。(S3側のコンテンツと分かるように中身を変えています。htmlの書き方についてはご容赦ください。。)
この状態からCloudFront①の代替ドメイン名「nehibloblg.tk」をCloudFront②へ移すことでCloudFrontディストリビューションの切り替えは完了します。つまり下記のようになれば完成です。
ターゲットディストリビューションの設定
今回は代替ドメイン名をCloudFront①から②へ移動させるので、ソースディストリビューションがCloudFront①、ターゲットディストリビューションがCloudFront②となります。 ドキュメントによると代替ドメイン名の移動にはターゲットディストリビューション側で以下3点の設定が前提なようです。
- 移動する代替ドメイン名を含む SSL/TLS 証明書を取得する
- ターゲットディストリビューションを作成し、1で取得した証明書を関連付ける。
- 代替ドメイン名をターゲットディストリビューションのディストリビューションドメイン名に関連付けるDNS TXT レコードを作成する。
代替ドメイン名 (CNAME) を追加することによるカスタム URL の使用 - Amazon CloudFront
では検証環境で上記の3点を設定していきます。
1. 移動する代替ドメイン名を含む SSL/TLS 証明書を取得する
検証環境ではACM発行の証明書を使用しました。
2. ターゲットディストリビューションを作成し、1で取得した証明書を関連付ける。
既にターゲットディストリビューションは作成済みなので、CloudFrontマネジメントコンソールより[設定]-[編集]-[カスタムSSL証明書]にて証明書を関連付けました。
3. 代替ドメイン名をターゲットディストリビューションのディストリビューションドメイン名に関連付けるDNS TXT レコードを作成する。
ドキュメントを一見した時はなぜTXTレコードが必要なのかが分かりませんでした。これは所有権検証用のTXTレコードを意味しており、ドメインとディストリビューションの所有者であることを証明するためのものです。今回の検証環境ではドメインのホストゾーンはRoute53で管理しているので、そちらに記載していきます。
以下のようにレコード名に「_<代替ドメイン名>」、値に「ターゲットディストリビューション ドメイン名」を入れて保存します。
代替ドメイン名をAPIで移動する
ターゲットディストリビューションの設定が完了すると代替ドメイン名を切り替えることができます。 切り替えには下記のAPIを使用します。
associate-alias --target-distribution-id
--alias
実際に切り替えてみます(不要な情報は省略しています)
【切り替え前に代替ドメイン名が無いことを確認】 $ aws cloudfront get-distribution-config --id <ターゲットディストリビューションID> "DistributionConfig": { "Aliases": { "Quantity": 0 }, 【代替ドメイン名の切り替え】 $aws cloudfront associate-alias --alias nehibloblg.tk --target-distribution-id <ターゲットディストリビューションID> 【切り替え後に代替ドメイン名が移動していることを確認】 $ aws cloudfront get-distribution-config --id <ターゲットディストリビューションID> "DistributionConfig": { "Aliases": { "Quantity": 1, "Items": [ "nehibloblg.tk" ] },
ちなみに、TXTレコードが無いと代替ドメイン名の切り替え時に下記のようなエラーが出ます。 DNSのTXTレコードをきちんと見ていることが分かりますね。
$ aws cloudfront associate-alias --alias nehibloblg.tk --target-distribution-id <ターゲットディストリビューションID> An error occurred (IllegalUpdate) when calling the AssociateAlias operation: Invalid or missing alias DNS TXT records. $
代替ドメイン名が完全に切り替わったので、DNSレコードを更新して代替ドメイン名の向き先をターゲットディストリビューションに変更し、再度ブラウザで代替ドメイン名を検索すると以下の通り、S3側へ切り替わっていました。
その他の切り替え方法
既出ですが、今回のようにAPIを利用して切り替えられるのは現時点で下記の2つの条件のどちらかを満たしている場合のみです。
ソースディストリビューションとターゲットディストリビューションが同じAWSアカウントにある場合
ソースディストリビューションとターゲットディストリビューションが異なるAWSアカウントにあるが、ターゲットディストリビューションの状態が無効になっている場合
この条件を満たさない場合は「ワイルドカード証明書を使用した切り替え」「AWS Supportに問い合わせて切り替え」の方法をとることができます。こちらについてもドキュメントに記載されていますので、詳しくはそちらをご覧ください。
代替ドメイン名 (CNAME) を追加することによるカスタム URL の使用 - Amazon CloudFront
まとめ
APIで切り替えができるようになったことを知らなかったので検証してみましたが、とても簡単に切り替えができました。 アップデート情報を追いかけることの大切さを改めて実感します。