awscliを使ったALBによるメンテナンス画面表示

概要

WEBアプリケーションでは、アプリケーションやDBのメンテナンス、バッチ処理の実行のためサービス提供を停止したいときがあります。アプリケーションの手前に設置するAWSのALBでは、アプリケーションと通信することなく固定レスポンスを返却することができますので、この機能を使いメンテナンス画面を表示したいと思います。今回はシェルスクリプトをAWS CLIで実現します。また、一部CLIコマンドが想定通りの動きをしなかったのですがCLIのバージョン2を使ったら問題は発生しませんでしたので、バージョン2を使っています。

実装方法

1. 設定ファイル読み込み
以下を変数として設定ファイルに外だししておきます。
・ALB名
・ALBリスナーポート
・ルールコンディション(Field、Values)
・固定レスポンスの内容(MessageBody、StatusCode、ContentType)

2. ALB名からALB ARNの取得
最終的にはALBのルールのARNを取得したいのですが、最初は変数のALB名を使い、ALB ARNを取得します。

ALB_ARN=$(aws elbv2 describe-load-balancers \
 --name ${ALB名} \
 --query 'LoadBalancers[].[LoadBalancerArn]' \
 --output text)

3. ALB ARNからALBのListener ARNの取得
2で取得したALBのARNからListener ARNを取得します。ここでは、複数のListenerが返却される可能性があるので、リスナーポートが設定ファイルに記述のポートのものに絞ります。これで返却されるListener ARNは一意になります。

LISTENER_ARN=$(aws elbv2 describe-listeners \
 --load-balancer-arn ${ALB_ARN} \
 --query "Listeners[?Port==\`${LISTENERポート}\`][].[ListenerArn]" \
 --output text)

4. Listener ARNから対象のRule ARNの取得
3で取得したListenerのARNから変更したいルールのARNを取得します。変更対象のルールは複数設定されていることもあるので、ARNは配列に格納します。ALBではホストヘッダやURLのパスでターゲットグループに応じて転送先を変えることができます。例えばルールのConditionのFieldがpath-patternであればパスベースルーティング、host-headerであればホストヘッダー(ホストベース)ルーティングという設定になります。ルールは複数設定されていますので、メンテナンス対象のアプリケーションのルールのConditionを設定ファイルに記述したFieldとValuesをもとに対象のRule ARNを絞ります。

以下コードではqueryを使って出力項目の絞り込みをしていますが、バッククォートを使って条件を記述する必要があるので、シェル変数に値を代入するときにはバッククォートは使わずに記述しないといけません(エスケープシーケンスを使ってできるかもしれませんが、コードが汚くなると思います)。
結果は配列に代入します。
また、query内の記述は試行錯誤で作成したので、、、冗長になっているかもしれません。

TARGET_RULE_ARN=($(aws elbv2 describe-rules \
 --listener-arn ${LISTENER_ARN} \
 --query "Rules[?Conditions[?Field==\`${ルールコンディションField}\`]|[?Values[0]==\`${ルールコンディションValues}\`]][].RuleArn[]" \
 --output text))

5. Rule ARNをもとに固定レスポンスを返却するActionに更新する
4で取得したRule ARNをもとにActionで固定レスポンスを返却するようにRuleを更新します。

for i in ${TARGET_RULE_ARN[@]}
do
  aws elbv2 modify-rule \
   --rule-arn ${i} \
   --actions Type=fixed-response,FixedResponseConfig="{MessageBody=${メッセージボディ},StatusCode=${ステータスコード},ContentType=${コンテントタイプ}}"
done

終わりに

実際に運用する際には、メンテナンス終了後に通常の転送先に変更する必要があると思いますが、同じようにmodify-rule使ってターゲットグループなどを設定するだけです。また、エラーハンドリングなどは一切書いていませんが、CLI実行後に記述すべきです。
CLIはともかくちょっと込み入ったことをqueryで書くと結構手間取りますね。

この記事が気に入ったらサポートをしてみませんか?