AWS
S3

ドメイン変更時にS3+cloudfrontでリダイレクト設定をする

今回はドメイン変更時のリダイレクトにS3を使用してみたのでその設定手順の要点(主にS3のリダイレクト設定部分)とハマったポイントのご紹介です。

今回の要件

手順

  1. リダイレクトさせる用のS3を作成する
  2. Route53にて新ドメインA recordに新CDNのエンドポイントを設定
  3. 現在設定しているcloudfront(以下旧CDN)と同一のcloudfront(以下、新CDN)を作成し、新CDN->Load balancer->EC2の流れを作成
  4. 旧CDNのoriginにリダイレクトに使用するS3を登録しておく
  5. 切り替え当日、旧CDNのbehaviorのoriginをS3に向ける

実施手順としては以下の図のようなイメージ

S3_redirect_numbering.png

1. リダイレクトに使用するS3を作成する

  • S3のバケットを作成

    • バケット名は旧ドメインと同じold.hogehoge.co.jpで作成
  • リダイレクトの設定

    • 「リクエストをリダイレクトする」か「リダイレクトルール」により設定可能
    • 今回は細かい要件があるためリダイレクトルールを使用する

リクエストをリダイレクトするの場合は、設定したドメイン配下のパスは全て引き継いだまま新ドメインにリダイレクトする

static website hostingから
このバケットを使用してウェブサイトをホストするを選択
インデックスドキュメント、エラードキュメントは適当なものを設定(index.html, error.html等)

  • リダイレクトルールについて
    Redirection rules に XML 形式でルールを設定。 よく使いそうなものを以下に纏める。
tag 詳細
RoutingRules ルールの一番大枠。お約束
RoutingRule このタグ内にルールを1つづつ設定。
Condition リダイレクトさせる条件を設定。
KeyPrefixEquals 置換させる対象のキー。フォルダで設定したい場合
KeyEquals 置換させる対象のキー
HttpErrorCodeReturnedEquals 特定のHTTPエラーコード毎にリダイレクトの設定を行う
Redirect リダイレクトさせる条件を設定。
HostName リダイレクト先のホスト名
ReplaceKeyPrefixWith 置換するキー。フォルダで設定したい場合
ReplaceKeyWith 置換するキー

詳細は公式のドキュメントを参照

  • リダイレクトルールは以下を設定

要件
一部のディレクトリ配下(/fuga)はドメインのみリダイレクト
  https://old.hogehoge.co.jp/fuga/n/xxx -> https://new.hogehoge.co.jp/fuga/n/xxx
それ以外は全て一律のURL(/honya/funya)にリダイレクトさせる
  https://old.hogehoge.co.jp/hoge/n/xxx -> https://new.hogehoge.co.jp/honya/funya

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>fuga</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <HostName>new.hogehoge.co.jp</HostName>
      <ReplaceKeyPrefixWith>fuga</ReplaceKeyPrefixWith>
    </Redirect>
  </RoutingRule>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <HostName>new.hogehoge.co.jp</HostName>
      <ReplaceKeyWith>honya/funya</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <HostName>new.hogehoge.co.jp</HostName>
      <ReplaceKeyWith>honya/funya</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>
  • ポイント
    • 今回は、パスを変えたくないものを先にリダイレクトさせ、その他はエラーから一定のアドレスにリダイレクトさせる作戦
    • リダイレクトルールは上から読み込む
    • S3には何もアップしないで空にしておき、リダイレクトルールにマッチしない場合は全て403,404エラーとなり一律の場所にリダイレクトされるようにする
    • リダイレクトルールの上限は50まで
      50を越して設定したい場合はこちらを参照
    • テストの際は、CDNのキャッシュやブラウザのキャッシュがあるので注意。シークレットモードを使ったりinvaridateしたりと工夫を。

2. 現在設定している旧CDNと同一の新CDNを作成し、新CDN->Load balancer->EC2の流れを作成

各環境に合わせ設定。
新しいドメイン用の証明書の作成には今回はACMを使用。新しいドメイン用の証明書としてACMを使用する場合は北部バージニアのリージョンで作成しなければならないことに注意。

3. Route53にて新ドメインのA recordに新CDNのエンドポイントを設定

切り替え時の作業でも良いが、事前作業が可能な場合は設定しておいたほうが切り替え時の手順を減らせます。

4. 旧CDNのoriginにリダイレクトに使用するS3を登録しておく

S3はストレージとして使う時とWebサイトとして使うときでエンドポイントが違う。
オートコンプリートはストレージのエンドポイントが出てくるので要注意
S3のstatic website hostingの設定の時に出てきたエンドポイント
{バケット名}.s3-website-{リージョン名}.amazonaws.comを指定すること

5. 切り替え当日、旧CDNのbehaviorのoriginをS3に向ける

CDNのbehaviorでのheaderの設定に注意。sslハンドシェイクできないのでAllの設定はできない。

Cloudfront-Origin間のHTTPS通信エラー原因と対策

所感

S3を立ててリダイレクト設定させる点は容易でしたが、いざやってみるとそれ以外の点で思った以上にやることがありました。切り替え当日を考え、やったことの整理ができるとシンプルな流れになったと思います。