目次

ソーリーページの切替え

ApplicationLoadBalancer(以下ALB)の[リスナー]-[ルール]で、固定ページを表示できる。
これを用いてメンテナンスや障害中にソーリーページをALBの機能だけで実現可能となっている。

このページでは、固定ページの設定方法とLambdaを用いた切替え方法を記載する。
いつものイメージ図
■構成図

■仕組み図

前提

■通常ページ
ターゲットグループ(転送先)に紐づいたEC2インスタンスで、Webサーバを立てている

■ソーリーページ
ALBの[リスナー]-[ルール]で、固定ページを設定する。

ALBでルールを設定する。

ロードバランサの[リスナー]タブから[ルールの表示/編集]をクリックする。

以下2つのルールを作成する。

Lambda関数では、ルールの優先度を変更することでページを切替えている。
デフォルトページは優先度が最下となっているため、2つのルールを作成することとなる。

以下に通常/ソーリーページの参考設定を記載する。

①通常ページのルール

■IF
・パス:*

■THEN
・転送先:ターゲットグループ

②ソーリーページのルール

■IF
・パス:*

■THEN
・固定ページを返す
・レスポンスコード:503
・Content-Type:text/html
・レスポンス本文:以下のように記載


<html>
<head>
<title>メンテナンスページ</title>
</head>
<h1 style="text-align:center">【〇〇システム】</h1>
<div style="text-align:center; font-size:24;">
<p>ただいまメンテナンス中です。</p>
</div>
<div style="text-align:center; font-size:24; color:red;">
<p>メンテナンス時間:毎日 20:00~08:00</p>
</div>
</br>
<div style="text-align:center; font-size:24;">
<p>メンテナンス終了までしばらくお待ちください。</p>
</div>
</html>

作成したルールのARNを控えます。

後工程のLambda関数で設定するので、ルールのARNをメモします。

Lambda関数の作成

以下2つのLambda関数を作成します。
・ソーリーページから通常ページに切替え:通常ページの優先度を1へ、ソーリーページの優先度を2へ
・通常ページからソーリーページに切替え:ソーリーページの優先度を1へ、通常ページの優先度を2へ

Codeは下記の記事まんまです。
https://dev.classmethod.jp/articles/alb-fixed-response/

ソーリーページから通常ページに切替え

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('elbv2')

    #ソーリーページから通常ページに切替え
    responce = client.set_rule_priorities(
        RulePriorities=[
            {
                'RuleArn': 'ターゲットグループを指定したリスナールールのARN',
                'Priority': 2
            },
            {
                'RuleArn': '固定ページを指定したリスナールールのARN',
                'Priority': 1
            },
        ]
    )

通常ページからソーリーページに切替え

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('elbv2')

    #通常ページからソーリーページに切替え
    responce = client.set_rule_priorities(
        RulePriorities=[
            {
                'RuleArn': '固定ページを指定したリスナールールのARN',
                'Priority': 2
            },
            {
                'RuleArn': 'ターゲットグループを指定したリスナールールのARN',
                'Priority': 1
            },
        ]
    )

実行結果

ALB固定レスポンスで、ソーリーページを表示した状態です。
htmlで書けるものなら色や文字サイズ等も可能でした。