背景
AWSのALB(Application Load Balancer)のリスナールールを使ってメンテナンス画面を表示することは一般的ですが、ALBのリスナールールには1024文字の制限があります。
そのため、1024文字を超えるメンテナンス画面を表示するための方法として、S3とLambdaを利用するアプローチを紹介します。
これにより、ALBのリスナールールの優先順位を変更することで、メンテナンス画面を自由かつ簡単に表示することができます。
設定時間も10分程度なので、ぜひやってみてください!
前提条件
- ALBを使用したWeb3層構造のアーキテクチャ構築済み(または構築予定の方)
構成概要
単純に、新しいルートを作って向き先を変えるだけです。(簡単でしょ!)
設計の流れ
- S3にメンテナンス画面のHTMLファイルをアップロード
- Lambda関数を作成して、S3からHTMLファイルを取得し、メンテナンス画面を表示
- ALBのリスナールールを設定して、特定の条件でLambda関数をトリガー
ステップ1: S3にメンテナンス画面のHTMLファイルをアップロード
まず、S3バケットを作成し、メンテナンス画面のHTMLファイルをアップロードします。
- AWSマネジメントコンソールにログインし、S3サービスに移動します
- 新しいバケットを作成します(例:
maintenance-bucket
) - バケットにメンテナンス画面のHTMLファイル(例:
maintenance.html
)をアップロードします(今回は1024文字以下のファイルですが、必要に応じて1025文字以上のファイルを作成してください)
<!DOCTYPE html>
<html>
<head>
<title>メンテナンス中</title>
</head>
<body>
<h1>ただいまメンテナンス中です</h1>
<p>ご迷惑をおかけして申し訳ありません。しばらくお待ちください。</p>
</body>
</html>
- 次に、S3バケットに対して以下のバケットポリシーを設定し、特定のHTMLファイルへの読み取りアクセスを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::maintenance-bucket/maintenance.html"
]
}
]
}
ステップ2: Lambda関数を作成して、S3からHTMLファイルを取得し、メンテナンス画面を表示
次に、Lambda関数を作成し、S3からHTMLファイルを取得してレスポンスとして返すように設定します。
下記の関数は、環境変数を使っているため、適宜変更してください。
- AWSマネジメントコンソールにログインし、Lambdaサービスに移動します
- 新しいLambda関数を作成します(例:
maintenance-lambda
) - ランタイムはPython 3.xを選択し、以下のコードをLambda関数に貼り付けます
import boto3
import os
# 環境変数からS3の情報を取得
BUCKET_NAME = os.environ['BUCKET_NAME']
FILE_NAME = os.environ['FILE_NAME']
s3 = boto3.client('s3')
def lambda_handler(event, context):
try:
# S3バケットからHTMLファイルを取得
response = s3.get_object(Bucket=BUCKET_NAME, Key=FILE_NAME)
body = response['Body'].read().decode('utf-8')
return {
'statusCode': 200,
'headers': {
'Content-Type': 'text/html'
},
'body': body,
'isBase64Encoded': False
}
except Exception as e:
return {
'statusCode': 500,
'body': f"Error getting the HTML from S3: {str(e)}"
}
- Lambda関数に必要なS3へのアクセス権限を持つIAMロールを割り当てます
ステップ3: ALBのリスナールールを設定して、特定の条件でLambda関数をトリガー
最後に、ALBのリスナールールを設定して、特定の条件下でLambda関数をトリガーします。
- ALBとLambdaを紐づけるターゲットグループを作成してください
- ALBのリスナールールに移動し、新しいルールを追加します
- リスナールールの条件として、特定のパス(例:
/maintenance
)やホストヘッダーを指定します - アクションとして、「固定レスポンス」ではなく、「ターゲットグループへ転送」を選択し、新しく作成したターゲットグループを指定します
- ルールの優先順位を設定して、通常のトラフィックよりも高い優先順位を付けます
これで、指定した条件に基づいてメンテナンス画面を表示するLambda関数がトリガーされるようになります。
リスナールールの優先順位を変更することで、メンテナンス画面の表示を柔軟にコントロールできます。
まとめ
この方法を使うことで、ALBのリスナールールの文字数制限を超えたメンテナンス画面を表示することが可能になります。
S3にホストされたHTMLファイルをLambda関数で取得し、ALBのリスナールールでトリガーすることで、メンテナンスのメッセージを簡単に管理できるようになります。