Route53のフェイルオーバールーティングでSorryページを実装する

# この記事について

Route53にはフェイルオーバールーティングというルーティングポリシーがあります。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy-failover.html

これを使えば、WEBサイトの障害時にSorryページとしてS3静的サイトにルーティングするということが可能です。

この記事では、WEBサイト障害時にSorryページに切り替えるフェイルオーバールーティングの実装手順について記載します。

## この記事に書くこと

フェイルオーバールーティングの設定方法のみです。
ALBやCloudfront+S3などの構築/設定方法については記載しません。


# 構成

フェイルオーバールーティングを実装する前は以下のような構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/1c1dc5fe-297d-6bae-2d1c-de9eb56bba0d.png)

※hoge.fugaというドメイン名はダミーです。実際はちゃんとしたドメイン名を利用しています。

ApacheをEC2上で動かして、ALBと接続します。ALBのエンドポイントをRoute53にAレコード(エイリアスレコード)として登録することで、hoge.fugaへのアクセスはEC2で稼働しているapacheにルーティングされます。

またSorryページとしてS3に静的HTMLファイルを配置して、Cloudfrontのオリジンとして構成します。
この時点ではCloudfrontのエンドポイントにアクセスすればSorryページが表示されます。

```
❯ curl https://hoge.fuga
This is EC2!!
```

```
❯ curl https://d1xxx11xx11xx1.cloudfront.net

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title></title>
  <meta name="Generator" content="Cocoa HTML Writer">
  <meta name="CocoaVersion" content="2113.6">
  <style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
  </style>
</head>
<body>
<p class="p1">This is S3 Origin!!</p>
</body>
</html>
```

見にくいけど"This is S3 Origin!!"が表示されます。

これをフェイルーオーバールーティングを利用して、以下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/bab3aaac-a106-17f4-7a58-35bcfe274085.png)


hoge.fugaへのアクセスは平常時はWEBサイトにルーティングされます。Route53からWEBサイトへのヘルスチェックが失敗したら、フェイルオーバーが行われてS3のSorryページにルーティングされるようになります。


# フェイルオーバールーティングの実装

## ヘルスチェックの作成

Route53からWEBサイトに対してヘルスチェックを送信するため、ヘルスチェックを新規作成します。
マネコンのRoute53の画面にヘルスチェックという欄があるため、そこから作成します。

以下の通り作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/2858cf08-c042-b586-c51d-d2ff89668f0b.png)

ヘルスチェックはALBのエンドポイントを対象とします。
また、SNIの有効化はチェックを外しておきましょう。

ヘルスチェッカーのリージョンはヘルスチェックの送信元になるチェッカーを指定できます。
「推奨を使用する」にするとチェッカーが多すぎるので、今回はカスタムにして3つに絞りました。
(チェッカーは最低3リージョン以上指定する必要があるようです。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/8a650a8e-e7e8-1c8e-407a-bfe8f29760b8.png)

通知は今回は受け取らないようにします。


作成後にステータスが正常になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/4b0a8088-3cf8-bf23-7759-0e136016458d.png)

(ヘルスチェッカーからの通信を許可しないと、ヘルスチェックは成功しません。ステータスが正常にならない場合はALBのセキュリティグループの設定を見直しましょう。またチェッカーのIPアドレスは一位のものでは無く、ヘルスチェック作成ごとに割り当てられるようなので注意しましょう。)


## フェイルオーバールーティングのレコード登録

プライマリから登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/0ae94c74-bf73-6113-fee7-da6a007972ba.png)

ヘルスチェックIDは先ほど作成したヘルスチェックのIDを指定します。
ルーティング先はALBへのエイリアスです。
レコードIDはなんでも良いですが、わかりやすいようにprimaryとしておきましょう。


次にセカンダリの登録です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/9359ef28-d1ec-fc19-204b-cac406c0d341.png)

プライマリとほぼ変わりないですが、セカンダリはヘルスチェックと紐付けてはいけないので注意しましょう。

# 動作確認

レコード登録後にhoge.fugaにリクエストを送った場合

```
❯ curl https://hoge.fuga
This is EC2!!
```

WEBサイトへアクセスできていることが確認できます。


EC2のapache(httpd)を停止して、フェイルオーバーが発生し、Sorryページにルーティングされることを確認します。

```
# systemctl stop httpd
```

ヘルスチェックが失敗していることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/737262dd-6d50-9e9e-1707-a24e995cae5e.png)


hoge.fugaにアクセスすると

```
❯ curl https://hoge.fuga
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title></title>
  <meta name="Generator" content="Cocoa HTML Writer">
  <meta name="CocoaVersion" content="2113.6">
  <style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
  </style>
</head>
<body>
<p class="p1">This is S3 Origin!!</p>
</body>
</html>
```

(フェイルオーバーが完了するまで、1,2分ほどかかりました)

次にapacheを起動して、フェイルバックができるかを確認します。

```
[root@ip-172-16-76-12 ~]# systemctl start httpd
```


1,2分ほど待ったら、フェイルバックが完了していました。


```
❯ curl https://hoge.fuga
This is EC2!!
```