サーバーが1台で冗長化構成をしていない場合に再起動などが必要なメンテナンスもあるかと思います。
例えば、EC2のインスタンスサイズを上げるとか、またはカーネルのアップデートなど。
そういう時に別のインスタンスを立ち上げるのもいいですが、今回はS3で静的ホスティングでメンテナンス画面を表示する方法を書いていきます。
大前提として、S3もCloudFrontも利用していることとします。
メンテナンスページの準備
-
S3に新しいバケットを作成します。(アクセスはパブリックにしておく。)
-
エンドポイントにアクセスして表示されることを確認します。
CloudFrontの設定
- 利用しているディストリビューションを選択し、メンテナンス用のオリジンを作成します。
- その際にオリジンドメインを先ほど作成したS3を選択します。
- 「S3 バケットアクセス」はOAIを使用にチェックを入れ、新しいOAIを作成します。
- 新しくビヘイビアを作成します。オリジンは先ほど作成したオリジンを指定します。
S3のバケットポリシーにCloudFrontのオリジンを許可
- S3の「アクセス許可」からバケットポリシーに以下のポリシーを追加する。
- オリジンのIDとバケット名は適宜変えてください。
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {オリジンのID}"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{バケット名}/*"
}
]
}
表示の確認
- https://example.com/maintenance.html のパスで表示されたらOKです!
特定のIPのみメンテナンスを表示しない場合
- CloudFrontの関数で新しく関数を以下のように追加します。
function handler(event) {
var request = event.request;
var clientIP = event.viewer.ip;
// アクセス許可するIPを設定
var IP_WHITE_LIST = [
'{対象の特定IP}',
];
// クライアントIPが、アクセス許可するIPに含まれていればtrueを返す
var isPermittedIp = IP_WHITE_LIST.includes(clientIP);
if (!isPermittedIp) {
var response = {
statusCode: 302,
statusDescription: 'Found',
headers:
{ "location": { "value": "https://example.com/maintenance.html" } }
}
return response;
} else {
return request;
}
}
- テストタブからリクエストを送信し、OKだったら発行タブから関数を発行します。
- もし、関数を変えたい場合は、構築タブで関数を変更し、そのあと必ず毎回「関数を発行」をクリックしてください。でなければ反映されません。
- あとは「関連付けられているディストリビューション」で関連付を追加し、対象のディストリビューションを選択すれば完了です。
最後に
いかがだったでしょうか?
AWSに慣れていないと少し難しく感じるかもしれませんが、一度試してみてください。
万が一急ぎや分からなければ、仕事の依頼という形になりますがお問い合わせ頂ければと思います。
投稿者について
山梨でやまなみテクノロジーズ株式会社の代表をしている小畑です。
WordPress周りの改修やweb制作、SEO対策やデータ分析にお困りでしたらお問い合わせください。