【AWS】ALBから自身(EC2)を切り離したり登録するbashスクリプト

ALBはELBと異なり複雑な構成も取れるので、必要に応じて修正して使う前提で、LBとTargetGroupとListenerが1:1:1の基本構成で作りました。

EC2をALBから切り離し

ほとんどをAPIから取得する構成にしましたが、複雑な構成なら変数として持った方が良いと思われます。

また、drainingのステータスはかなり長いので本当にそれを終わるまで待つかは以下などを読んで要判断かと。

登録解除するターゲットの初期状態は draining です。登録解除の遅延が経過すると、登録解除プロセスは完了し、ターゲットの状態は unused になります。ターゲットが Auto Scaling グループの一部である場合、ターゲットを終了して置き換えることができます。ただし、ロードバランサノードと登録解除するターゲットとの間の接続は、処理中のリクエストがある場合は最大 1 時間保持されます。

Application Load Balancer のターゲットグループ - Elastic Load Balancing

#!/bin/bash
if [ -z $1 ];then
  echo "usage $0 alb_name"
  exit -1
fi

ALB_NAME=$1
TIMEOUT_SEC=300
POLL_INTERVAL=5

instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
lb_arn=$(aws elbv2 describe-load-balancers --names ${ALB_NAME} --query 'LoadBalancers[].LoadBalancerArn' --output text)
target_group_arn=$(aws elbv2 describe-listeners --load-balancer-arn ${lb_arn} --query 'Listeners[].DefaultActions[].TargetGroupArn' --output text)
listen_port=$(aws elbv2 describe-listeners --load-balancer-arn ${lb_arn} --query 'Listeners[].Port' --output text)

status=$(aws elbv2 describe-target-health  --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port} --query 'TargetHealthDescriptions[].TargetHealth.State' --output text)

if [ ${status} == "unused" ]; then
  echo "instance already deregistered"
  exit -1
fi

#ALBよりEC2インスタンスを切り離し
aws elbv2 deregister-targets --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port}

while :
do
  status=$(aws elbv2 describe-target-health  --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port} --query 'TargetHealthDescriptions[].TargetHealth.State' --output text)
  if [ ${status} == "unused" ]; then
    echo "[$(date +%H:%M:%S)] instance deregistered successfully"
    break
  else
    echo "[$(date +%H:%M:%S)]${status}"
    sleep ${POLL_INTERVAL}
  fi
  TIMEOUT_SEC=$((${TIMEOUT_SEC} - ${POLL_INTERVAL}))
  if [ ${TIMEOUT_SEC} -lt 0 ]; then
    echo "timeout occured!"
    exit 1
  fi
done

EC2をALBに登録

切り離しとほとんど変わらないです。

#!/bin/bash
if [ -z $1 ];then
  echo "usage $0 alb_name"
  exit -1
fi

ALB_NAME=$1
TIMEOUT_SEC=120
POLL_INTERVAL=5

instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
lb_arn=$(aws elbv2 describe-load-balancers --names ${ALB_NAME} --query 'LoadBalancers[].LoadBalancerArn' --output text)
target_group_arn=$(aws elbv2 describe-listeners --load-balancer-arn ${lb_arn} --query 'Listeners[].DefaultActions[].TargetGroupArn' --output text)
listen_port=$(aws elbv2 describe-listeners --load-balancer-arn ${lb_arn} --query 'Listeners[].Port' --output text)

status=$(aws elbv2 describe-target-health  --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port} --query 'TargetHealthDescriptions[].TargetHealth.State' --output text)

if [ ${status} != "unused" ]; then
  echo "instance already registered [status:${status}]"
  exit -1
fi

#ALBにEC2インスタンスを登録
aws elbv2 register-targets --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port}

while :
do
  status=$(aws elbv2 describe-target-health  --target-group-arn ${target_group_arn} --targets Id=${instance_id},Port=${listen_port} --query 'TargetHealthDescriptions[].TargetHealth.State' --output text)
  if [ ${status} == "healthy" ]; then
    echo "[$(date +%H:%M:%S)] instance registered successfully"
    break
  else
    echo "[$(date +%H:%M:%S)]${status}"
    sleep ${POLL_INTERVAL}
  fi
  TIMEOUT_SEC=$((${TIMEOUT_SEC} - ${POLL_INTERVAL}))
  if [ ${TIMEOUT_SEC} -lt 0 ]; then
    echo "timeout occured!"
    exit 1
  fi
done