やりたいこと
サービスのメンテナンスモードをロードバランサーの切り替えだけで実現したい。
環境
- AWSでALBを使っている
やり方
- ALBのリスナールールに設定する。
こちらをやります。(クラスメソッドさんありがとう)
https://dev.classmethod.jp/cloud/aws/alb-fixed-response/
- メンテナンス中は、HTTPステータス503、レスポンスbodyにjsonを出力する。
ALBは正しく設定されている前提で必要な部分のみ抜粋して掲載します。
AWSTemplateFormatVersion: '2010-09-09'
Description: ・・・・
Resources:
:
(省略)
:
# 通常パターンのリスナールール
ALBListenerRule:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
DependsOn: ALBListener
Properties:
Actions:
- Type: forward
TargetGroupArn: !Ref 'ALBTarget'
Conditions:
- Field: path-pattern
Values:
- '*'
ListenerArn: !Ref 'ALBListener'
Priority: 1
# メンテナンスモードのリスナールール
ALBListenerRule503:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
DependsOn: ALBListener
Properties:
Actions:
- Type: fixed-response
FixedResponseConfig:
ContentType: 'application/json'
MessageBody: |
{
"error_message": "メンテナンス中です。"
}
StatusCode: 503
Conditions:
- Field: path-pattern
Values:
- '*'
ListenerArn: !Ref 'ALBListener'
Priority: 2
:
(以下省略)
通常は、ALBのターゲットにforwardするが、メンテナンス中はバックのシステムに飛ばさず、固定のJSONを出すため、 Actions の Type に fixed-response を指定する。
固定でだすステータスや JSONのデータは、FixedResponseConfig に指定する。
実際にメンテナンスモードにする場合は、AWSマネージメントコンソールにログインし、ALB リスナールールの画面を開き、優先順位を503のルールが優先順位1位になるように変更する。
今回は固定のJSONを出力したけど、画面を出したい場合はHTMLを設定することも可能。