LBのリスナーでBL/GRのターゲットを切り替えるシェル

概要

BL/GR切り替えをLBのリスナーからターゲットグループで切り替えることを実装する際に使用したシェルをメモ的に記載します。

【動作前提】

・BL/GRのEC2が共に起動中であること

【動作要領】

・ALBのリスナールールにて向き先のターゲットグループを切り替えることによりBL/GRのEC2を切り替える

・シェル実行時にリスナーのデフォルトの向き先がBLであればGRに切り替え、GRであればBLに切り替える

シェルスクリプト

以下の内容のシェルスクリプトを作成し、必要な場所に配置して実行する。

#!/bin/bash
## MESSAGE FUNCTION
function alert () {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [$1] $2"
}

## VARIABLES
PRD_ALB_ARN="ALBのARN"
PRD_BL_PC_TG_ARN="Blue用のPCのTGのARN"
PRD_BL_SMT_TG_ARN="Blue用のSMTのTGのARN"
PRD_GR_PC_TG_ARN="Green用のPCのTGのARN"
PRD_GR_SMT_TG_ARN="Green用のSMTのTGのARN"
PRD_LISTENER_ARN="ALBのリスナーのARN"

## CURRENT COLOR
PRD_CURRENT_COLOR=$(aws elbv2 describe-listeners \
 --listener-arns ${PRD_LISTENER_ARN} \
 --query 'Listeners[].DefaultActions[].TargetGroupArn' --output text | cut -d/ -f2 \
 )

## CHANGE TARGET TO ANOTHER COLOR
if [ "${PRD_CURRENT_COLOR}" = "bl-pc-http-tg" ]; then
 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_GR_PC_TG_ARN} \
  --conditions Field=path-pattern,Values='/sitemap/*' \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_GR_PC_TG_ARN} \
  --conditions Field=path-pattern,Values='/assets/custom_sitemap*' \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_GR_PC_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_GR_SMT_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_GR_SMT_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-listener \
  --listener-arn ${PRD_LISTENER_ARN} \
  --protocol HTTPS --port 443 \
  --ssl-policy ELBSecurityPolicy-2016-08 \
  --default-actions Type=forward,TargetGroupArn=${PRD_GR_PC_TG_ARN}

 alert "SUCCESS" "ALB LISTENER CHANGE TARGET GREEN"
 exit 0
elif [ "${PRD_CURRENT_COLOR}" = "gr-pc-http-tg" ]; then
  aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_BL_PC_TG_ARN} \
  --conditions Field=path-pattern,Values='/sitemap/*' \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_BL_PC_TG_ARN} \
  --conditions Field=path-pattern,Values='/assets/custom_sitemap*' \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_BL_PC_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_BL_SMT_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-rule \
  --actions Type=forward,TargetGroupArn=${PRD_BL_SMT_TG_ARN} \
  --rule-arn ${PRD_ALB_ARN}:<ルールのARN>

 aws elbv2 modify-listener \
  --listener-arn ${PRD_LISTENER_ARN} \
  --protocol HTTPS --port 443 \
  --ssl-policy ELBSecurityPolicy-2016-08 \
  --default-actions Type=forward,TargetGroupArn=${PRD_BL_PC_TG_ARN}
 
 alert "SUCCESS" "ALB LISTENER CHANGE TARGET BLUE"
 exit 0
else
 alert "ALERT" "ALB LISTENER HAS NO COLOR"
 exit -1
fi