はじめに

こんにちは、MSP の田所です。

みなさんは Route 53, ACM, CloudFront, S3 をごそっとアカウント移行したいと思った経験はありませんか?

えっ?ないですか?

 

それではこの中で移行時にダウンタイムが発生するのはどれでしょうか?

えっ?興味ないですか?

 

そんなこと言わずにお付き合いくださいmm

 

やりたいこと

アカウント A からアカウント B に移行

 

静的ウェブサイトホスティングをしている想定です。

 

移行してみる

0. NS レコードの TTL 調整

Route 53 で現役の NS レコードの TTL を下げておきます。
ネームサーバーをスムーズに切り替えるための準備です。

 

1. リソース作成

 

[アカウントB] 証明書の作成

ACM でドメイン証明書を取得します。
CloudFront 用なので us-east-1 です。

 

[アカウント A ] 証明書の DNS 認証

Route 53 で CNAME レコードを登録して証明書を認証します。

 

[アカウントB] S3 バケット、CloudFront ディストリビューション、Route 53 ホストゾーンの作成

ACM でドメイン証明書の認証を確認します。

 

S3 バケットを作成し、データをコピーします。
IAM ユーザー、IAM ロール、アカウント A での S3 バケットポリシーの設定が必要になりますが今回は割愛します。
また S3 バケット名は異なる名前にする必要があります。
同じ名前にしたい場合は、コピー → 現行バケットの削除 → 新規バケットの作成 → コピーバケットからのコピー のステップとなります。

 

CloudFront ディストリビューションを作成します。
ドメイン名がアカウント A のディストリビューションで使用されているため、代替ドメイン名は未入力の状態です。
また先ほど作成した証明書と S3 バケットを、カスタム SSL 証明書とオリジンに指定します。
残念ながら CloudFront はアカウント移行がサポートされていないと明記されています。

Amazon CloudFront では 1 つの AWS アカウント から別の AWS アカウント へディストリビューションを移行することをサポートしていません。

 

Route 53 ホストゾーンを作成します。
レコードのリストをダウンロードして別のホストゾーンにアップロードすることもできます。
ただしリストの編集が必要なため、レコードが少なければ手動で登録してしまった方が早いかもしれません。
NS, SOA レコードが初期で設定されているので、そこに必要なレコードを追加していきます。
今回は、先ほど作成した CloudFront ディストリビューションドメイン名に向けた A レコードと、証明書の CNAME レコードを登録します。

 

2. 切り替え

 

[ドメインレジストラ] ネームサーバー情報の更新

ドメインレジストラでネームサーバー情報をアカウント B の NS レコード情報に更新します。
末尾のドットは不要です。

 

直後は特に変化ありません。

 

[アカウント A ] 代替ドメイン名の削除

CloudFront の代替ドメイン名を削除します。
ルートドメインの場合はここでダウンタイムが発生します。
サブドメインであれば CNAME を工夫することでダウンタイムなしの切り替えが可能です。

代替ドメイン名の移動について
apexドメイン(ルートドメイン) サブドメイン
同じ AWS アカウント内 associate-alias コマンドで移動可能 associate-alias コマンドで移動可能
別の AWS アカウント間 手動で移動(今回はこちら) ワイルドカードを使用して移動可能

 

 

サイト閲覧できません。

 

[アカウント B] 代替ドメイン名の追加

CloudFront の代替ドメイン名を追加します。
DNS プロパゲーションの時間があるため、理論的にはダウンタイム発生の可能性はありますが、今回はここで復旧を確認しました。

 

アカウント B の S3 バケット、証明書の適用を確認しました。

 

プロパゲーション待ち

世界中の全てのネームサーバーがアカウント B の DNS レコードを参照するようになるまで待ちます。
以下のようなチェックサイトで伝播の進行状況を確認できます。
一般的にはプロパゲーション完了まで48時間を見ておけば安心なようです。

 

3. リソース削除

 

[アカウント A] Route 53 ホストゾーン、CloudFront ディストリビューション、ACM 証明書、S3 バケットの削除

切り替え前のリソースを削除します。

  • Route 53 ホストゾーン:NS, SOA 以外のレコードを削除してからホストゾーンを削除
  • CloudFront ディストリビューション:無効にしてから削除
  • ACM 証明書:CloudFront との紐付け解除が済んでから削除
  • S3バケット:空にしてから削除

 

おわりに

無事にアカウントを移行することができました。
Route 53 のレコードや CloudFront のビヘイビア設定が大量だったり、S3 のファイルが多すぎたり同期が必須だったり、、
まだまだ複雑になる要因は考えられますが、エッセンスとして参考になれば幸いです。
CloudFront の代替ドメイン名の付け替えでどうしてもダウンタイムが発生してしまうのが悔しいポイントでした。

おしまい