Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

【AWS】ALBの固定レスポンスでメンテナンス画面表示してみた

はじめに

メンテナンス時の運用は構成や手法によって様々だと思いますが、一時的にメンテナンスページを表示して、裏で作業を行うことも多いのではないでしょうか。
AWSではメンテナンスページ表示のために使えるサービスはいくつかありますが、今回はALBのみを使ってメンテナンスページを表示する手法について試す機会があったので、ご紹介します。
具体的には、ALBリスナールールの固定レスポンスを使用します。

ALBの固定レスポンスとは

ALBの固定レスポンスとは、リスナールールに設定できるアクションのひとつです。
通常は転送アクション(ターゲットグループへ転送)を設定し、ターゲットグループ配下にあるEC2やECSコンテナなどにアクセス/応答させますが、固定レスポンスのアクションではカスタムHTTPレスポンスを返します。

固定レスポンスを試してみる

実際に、固定レスポンスでメンテナンスページを表示してみます。

ALBを作成

お試しなので正常時のアクセス先も固定レスポンスで作成してみます。
ALBを作成し、デフォルトルートのターゲットにはダミーのターゲットグループを指定しています。

testで作成した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つの手法として、参考になりましたら幸いです。

参考

  1. AWS - 固定レスポンスアクション
    https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#fixed-response-actions