👻

ALBで簡単にメンテナンスモードを実装する

2025/01/05に公開

はじめに

サービス運用の中で、計画的なメンテナンスや障害対応時に「メンテナンスモード」を導入することは重要です。本記事では、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