ALBで簡単にメンテナンスモードを実装する
はじめに
サービス運用の中で、計画的なメンテナンスや障害対応時に「メンテナンスモード」を導入することは重要です。本記事では、AWSのアプリケーションロードバランサー(ALB)を活用して、簡単にメンテナンスモードを実装する方法を紹介します。
ALBのリスナールールとターゲットグループを活用し、柔軟かつ迅速にモード切替を実現する方法について解説します。
実装方法
1. メンテナンスモード用のリスナールールを追加
まず、メンテナンスモードを実現するためのルールをALBのリスナーに追加します。
設定内容
-
条件: パスがすべて(
*
)に一致するリクエストを対象とする。 - アクション: 固定レスポンスを返す。例えば、HTTP 503ステータスコードと「ただいまメンテナンス中です。」というメッセージ。
メンテナンスページの表示について
今回は固定レスポンスで返しますが、自分で用意したメンテナンスページがある場合は、「URLにリダイレクト」で自分のURLを設定すると、よりカスタマイズされたページを表示できます。
2. エンジニアや特定のユーザーがアクセスできるようにするリスナールールの追加
メンテナンスモード中に動作確認などをするために、特定の条件で通常と同じようにアクセスできるようにします。
今回は、Cookieにmaintenance_mode=true
が含まれる場合に通常のサービスにリダイレクトします。
設定内容
-
条件: HTTPヘッダー内のCookieに
maintenance_mode=true
が含まれる場合に通常のサービスを提供する。 - アクション: 通常のターゲットグループにリクエストをフォワードする。
補足: 上記例では固定レスポンスを使用していますが、実運用では通常のターゲットグループを設定することを推奨します。
優先度の設定
Cookieを条件とするルールの優先度は、メンテナンスモードのルールよりも高く設定する必要があります。これにより、特定条件を満たしたユーザーは通常どおりアクセス可能になります。
補足
*maintenance_mode=true*にしないとうまく動作しない理由
以下はGoogle検索した時ですが、Cookieはリクエストの中に基本複数あります。
設定をmaintenance_mode=trueにすると、Cookieがこれだけの時にリダイレクトするという意味になります。基本WebサイトやアプリのCookieはmaintenance_mode=true以外に複数あるので、他のがあるとうまくリダイレクトされません。
ですので設定の前後に*をつけて、Cookieが複数の時でも対応できるようにしないといけません。
Terraformを使った実装例
前提条件
- ALBは既に構築済み。
- メンテナンスモードの有効化は変数(例:
var.maintenance_mode
)で切り替える。
Terraformコード
メンテナンスモードの通常アクセス許可ルール
resource "aws_lb_listener_rule" "maintenance_forward" {
count = var.maintenance_mode ? 1 : 0
listener_arn = aws_alb_listener.https.arn
priority = 100
condition {
http_header {
http_header_name = "Cookie"
values = ["*maintenance_mode=true*"]
}
}
action {
type = "forward"
target_group_arn = aws_alb_target_group.ecs_service.arn
}
}
メンテナンスモードの固定レスポンスルール
resource "aws_lb_listener_rule" "maintenance_fixed_response" {
count = var.maintenance_mode ? 1 : 0
listener_arn = aws_alb_listener.https.arn
priority = 200
condition {
path_pattern {
values = ["*"]
}
}
action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "ただいまメンテナンス中です。"
status_code = "503"
}
}
}
解説
-
条件設定:
var.maintenance_mode
を切り替えることで、メンテナンスモードの有効化・無効化を簡単に行えます。 -
優先度設定: 通常アクセス用ルールの優先度(
priority = 100
)を高く設定し、すべてのパス用のルール(priority = 200
)よりも先に評価されるようにしています。
まとめ
ALBを活用したメンテナンスモードの実装は、短時間で設定でき、運用に柔軟性を持たせられる方法です。特定のユーザーに通常アクセスを許可する設定や、Terraformでの自動化を組み合わせることで、効率的かつ安全にメンテナンスを行うことが可能になります。
メンテナンスの頻度や用途に応じて、今回の方法を適宜カスタマイズしてみてください!
Discussion