はじめに
メンテナンス時の運用は構成や手法によって様々だと思いますが、一時的にメンテナンスページを表示して、裏で作業を行うことも多いのではないでしょうか。
AWSではメンテナンスページ表示のために使えるサービスはいくつかありますが、今回はALBのみを使ってメンテナンスページを表示する手法について試す機会があったので、ご紹介します。
具体的には、ALBリスナールールの固定レスポンスを使用します。
ALBの固定レスポンスとは
ALBの固定レスポンスとは、リスナールールに設定できるアクションのひとつです。
通常は転送アクション(ターゲットグループへ転送)を設定し、ターゲットグループ配下にあるEC2やECSコンテナなどにアクセス/応答させますが、固定レスポンスのアクションではカスタムHTTPレスポンスを返します。
固定レスポンスを試してみる
実際に、固定レスポンスでメンテナンスページを表示してみます。
ALBを作成
お試しなので正常時のアクセス先も固定レスポンスで作成してみます。
ALBを作成し、デフォルトルートのターゲットにはダミーのターゲットグループを指定しています。

次に、リスナールールを追加して、通常のアクセスでは正常な固定レスポンス画面を表示するよう設定します。
固定レスポンスでは①レスポンスコード、②コンテンツタイプ、③レスポンス本文が設定できます。条件や優先度も含めて以下のように設定しました。
| 項目 | 設定値 |
|---|---|
| 条件 | 送信元IP |
| 送信元IP | 0.0.0.0/0 |
| アクションの種類 | 固定レスポンスを返す |
| レスポンスコード | 200 |
| コンテンツタイプ | text/html |
| 優先度 | 20 |
【レスポンス本文】
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>正常にアクセスできました</title> <style> body { background-color: #f0fff0; font-family: sans-serif; text-align: center; padding: 100px 20px; } h1 { color: #2e8b57; font-size: 24px; margin-bottom: 20px; } p { color: #333333; font-size: 16px; } </style> </head> <body> <h1>正常にアクセスできました</h1> <p>このページは正常に表示されています。<br> サイトは現在稼働中です。</p> </body> </html>

これでALBのDNS名へアクセスしてみると、以下のような画面になりました。

このように、固定レスポンスではHTMLで作成した簡単なページを表示できます。
ただし、本文は1024文字以内という制約があるため、詳細なページを作成することはできません。
メンテナンスページの固定レスポンスを追加
では、本題のメンテナンスページを固定レスポンスで表示させてみます。
予定していたメンテナンス作業を開始するときにメンテナンスページを表示させたい、といった状況での使用を想定としています。
先と同様に、新しくルールを追加します。 複数のルールがあるときには優先度順で処理されるため、正常レスポンスのルールよりも優先度を高く(設定値は小さく)する必要があります。
| 項目 | 設定値 |
|---|---|
| 条件 | 送信元IP |
| 送信元IP | 0.0.0.0/0 |
| アクションの種類 | 固定レスポンスを返す |
| レスポンスコード | 503 |
| コンテンツタイプ | text/html |
| 優先度 | 10 |
【レスポンス本文】
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>メンテナンス中</title> <style> body { background-color: #ffcccc; font-family: sans-serif; text-align: center; padding: 100px 20px; } h1 { color: #993333; font-size: 24px; margin-bottom: 20px; } p { color: #333333; font-size: 16px; } </style> </head> <body> <h1>ただいまメンテナンス中です</h1> <p>ご不便をおかけして申し訳ございません。<br> メンテナンス終了までしばらくお待ちください。<br> 予定時間:12:00~14:00 (JST)</p> </body> </html>

これで再度ALBのDNS名へアクセスしてみると、以下のようにメンテナンスページが表示されました。

このように、固定レスポンスのルールを追加することで、サイトにアクセスしようとした利用者にメンテナンスページを表示できます。
シンプルな画面ですが、何時までメンテナンスなのかなど最低限の情報は伝えることが可能です。
特定のIPからは正常にアクセスできるようにする
ここまでの設定では、すべてのアクセスでメンテナンスページが表示されます。
しかし実際の運用では、運用作業者など一部のユーザーはアップデート後のWeb画面を確認するなど、メンテナンス中に正常なページを見る必要があると思います。
このような場合も、ルールを追加することで実現できますので、試してみます。
以下の設定でルールを追加します。
このルールはメンテナンスページのルールより高い優先度で追加する必要があります。
| 項目 | 設定値 |
|---|---|
| 条件 | 送信元IP |
| 送信元IP | x.x.x.x/32 |
| アクションの種類 | 固定レスポンスを返す |
| レスポンスコード | 200 |
| コンテンツタイプ | text/html |
| レスポンス本文 | <正常なページと同じ内容> |
| 優先度 | 1 |
ここで、送信元IPにはアクセスを許可したいIPアドレス(CIDR)を入れます。
条件の送信元IPには最大5つのCIDRを設定できます。
検証を行った環境では、使用した端末のIPを入れてみました。
これで、使用した端末のIPからアクセスした場合は正常なページが、その他のIPからアクセスした場合はメンテナンスページが表示されるはずです。
使用した端末のIPからアクセスした結果ですが、正常なページが表示されました。

また、その他のIPからアクセスしてみると、メンテナンスページが表示されました。
これで、メンテナンス中に必要な確認だけは行えるような設定が可能です。
最終的に、ルールの設定はこのようになりました。

実際の環境で使用する際には、正常なページの固定レスポンスとしているルールが、ターゲットグループへの転送ルールに置き換わっていると思います。
おわりに
ALBの固定レスポンスでメンテナンスページを表示する手法についてご紹介しました。
手作業が必要になりますが、構成を変えられない環境や、シンプルな画面のみでよい場合などに使用できる手法かなと思います。
一方で、「本文が1024文字まで」「条件の送信元IPが5つまで」という制約があったり、毎週特定の時間にメンテナンスページになるように自動化するなどの際には作りこみが必要なため、要件によっては他の手段も検討が必要です。
メンテナンス表示の1つの手法として、参考になりましたら幸いです。