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