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

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

# 今回の要件
* ドメインを変更する（old.hogehoge.co.jp -> new.hogehoge.co.jpとする）
* 一部のディレクトリ配下（/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
* リダイレクト元はhttpsなのでcloudfrontをS３の前に使用
* ドメインを変更する案件の構成は以下の通り  
　cloudfront->Load balancer->EC2

# 手順

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

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

![S3_redirect_numbering.png](https://qiita-image-store.s3.amazonaws.com/0/247335/4cabe7f8-c662-69e0-b970-d90c30d01876.png)




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

* S3のバケットを作成
  - バケット名は旧ドメインと同じold.hogehoge.co.jpで作成

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

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

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

* リダイレクトルールについて  
Redirection rules に XML 形式でルールを設定。
よく使いそうなものを以下に纏める。

|tag  |詳細  |
|---|---|
|**RoutingRules**  |ルールの一番大枠。お約束 |
|**RoutingRule**  |このタグ内にルールを１つづつ設定。 |
|**Condition**  |リダイレクトさせる条件を設定。|
|KeyPrefixEquals  |置換させる対象のキー。フォルダで設定したい場合|
|KeyEquals  |置換させる対象のキー|
|HttpErrorCodeReturnedEquals  |特定のHTTPエラーコード毎にリダイレクトの設定を行う|
|**Redirect**  |リダイレクトさせる条件を設定。|
|HostName  |リダイレクト先のホスト名|
|ReplaceKeyPrefixWith  |置換するキー。フォルダで設定したい場合|
|ReplaceKeyWith  |置換するキー|

詳細は[公式のドキュメントを参照](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/how-to-page-redirect.html)


* リダイレクトルールは以下を設定  
 
*要件*
*一部のディレクトリ配下（/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*


```XML
<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>
```

* ポイント
 - 今回は、パスを変えたくないものを先にリダイレクトさせ、その他はエラーから一定のアドレスにリダイレクトさせる作戦
 - リダイレクトルールは上から読み込む
 - S３には何もアップしないで空にしておき、リダイレクトルールにマッチしない場合は全て403,404エラーとなり一律の場所にリダイレクトされるようにする
 - リダイレクトルールの上限は５０まで   
 [５０を越して設定したい場合はこちらを参照](http://blog.kikudai.com/post/dec-03-2016_01/)
 - テストの際は、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をS３に向ける

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

[Cloudfront-Origin間のHTTPS通信エラー原因と対策](https://qiita.com/kaojiri/items/4e2d2f112acfca14970e)

# 所感

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