CloudFrontのCNAMEをディストリビューション間でダウンタイム無しにアトミックに移行できるようになりました

2021.07.08

Amazon CloudFrontはディストリビューション間のCNAMEの重複が許可されていません。 そのため、この CNAMEAlreadyExists 回避のために、

  • AWSサポートに対応を依頼
  • ワイルドカード形式のCNAMEを経由して付け替え

といった対応が行われてきました。

今回のアップデートにより、条件付きではありますが、ダウンタイム無しにディストリビューション間でアトミックにCNAMEを付け替えられるようになりました。

New APIs and functionality for managing Amazon CloudFront CNAMEs | Networking & Content Delivery

前提条件

以下のいずれかの条件を満たす場合、アトミックにCNAMEを付け替えられます。

  • ディストリビューションが属するAWSアカウントが同じ
  • ディストリビューションが属するAWSアカウントが別で移行元の状態がdisabled

上記に当てはまらない場合、次の記事を参照ください。

CloudFrontのCNAMEAlreadyExistsエラーを解決するフローチャート(2021年夏版) | DevelopersIO

やってみた

今回は同一AWSアカウントに属する2つのディストリビューション間でCNAMEを交換します。

  1. 移行先(ターゲット)ディストリビューションをDNS TXTレコードで追加
  2. CloudFront::AssociateAlias API の実行

の2ステップが必要です。

1. 移行先(ターゲット)ディストリビューションをDNS TXTレコードで追加

  • 付け替える CNAME
  • 移行先ディストリビューション

を TXT レコードで追加します。

例えば、

  • 付け替える CNAME : www.example.com
  • 移行先ディストリビューション : EXAMPLETARGET(target.cloudfront.net)

の場合、CNAMEを「_」で接頭した名前のTXTレコードを追加します。

$ dig _www.example.com. TXT +noall +ans
; <<>> DiG 9.10.6 <<>> TXT _www.example.com. +noall +ans
;; global options: +cmd
_www.example.com.		289	IN	TXT	"target.cloudfront.net"

合わせて、この CNAME の向き先を、新しいディストリビューションに変更します。

NAME TYPE Record
www.example.com ALIAS target.cloudfront.net
_www.example.com TXT target.cloudfront.net

2. CloudFront::AssociateAlias API の実行

CloudFront::AssociateAlias API

  • 移行先のディストリビューションID
  • 付け替えるCNAME

を指定します。

$ aws cloudfront associate-alias \
  --target-distribution-id EXAMPLETARGET \
  --alias www.example.com
$

検証用の TXT レコードが存在しない場合

An error occurred (IllegalUpdate) when calling the AssociateAlias operation: Invalid or missing alias DNS TXT records.

というエラーが発生します。

移行元ディストリビューションに複数のCNAMEがある場合

移行元ディストリビューションに複数のCNAMEが設定されている場合、移行するCNAMEだけが削除されます。

クロスアカウント移行の場合

API の実行先は移行先ディストリビューションです。 クロスアカウントでCNAMEを付け替える場合、必要な権限は移行先AWSアカウントのものです。

最後に

CloudFrontのCNAMEAlreadyExistsエラーの回避方法として ディストリビューション間でCNAMEをアトミックに交換する方法を紹介しました。

ダウンタイム無しに、1 APIでアトミックに実行できるため、ディストリビューションの移行作業がシンプルになりました。

この機能を利用するには

  • ディストリビューションが属するAWSアカウントが同じ
  • ディストリビューションが属するAWSアカウントが別で移行元の状態がdisabled

という制約がある点にご注意ください。

参考