set setting reset

インフラ関連の小ネタと備忘録

ELB に登録されているインスタンスを解除 & 指定したインスタンスを ELB に登録

ELB に登録されているインスタンスを全て解除する

#!/bin/bash

aws="/usr/bin/aws --region ap-northeast-1"
elb_names=("elb-1" "elb-2")

deregister_instances_from_elb()
{
    for elb_name in ${elb_names[@]}
    do
        # get registerd instance ids per elb
        deregister_instance_ids=$(${aws} elb describe-load-balancers \
            --load-balancer-names ${elb_name} \
            --query 'LoadBalancerDescriptions[].Instances[].InstanceId' \
            --output text)

        # deregister instances from elb
        ${aws} elb deregister-instances-from-load-balancer \
            --load-balancer-name ${elb_name} \
            --instances ${deregister_instance_ids} \
            || echo "ERROR. failed to deregistered ${deregister_instance_ids} from ${elb_name}" | exit 1

        echo "OK. deregistered ${deregister_instance_ids} from ${elb_name}"
    done
}

deregister_instances_from_elb

指定したインスタンスを指定した ELB に登録

リストで持たせた NAME TAG から InstanceId を取得して一気に ELB に登録します。 また、登録した全てのインスタンスが InService になるまで待ちます。

#!/bin/bash

aws="/usr/bin/aws --region ap-northeast-1"
elb_names=("elb-1" "elb-2")
regist_servers=("web-1" "web-2" "web-3" "web-4")

register_instances_with_elb()
{
    for elb_name in ${elb_names[@]}
    do
        # get instance ids from Name Tag
        for regist_server in ${regist_servers[@]}
        do
            regist_instance_id=$(${aws} ec2 describe-instances \
                --filters Name=tag-value,Values=${regist_server} \
                --query 'Reservations[].Instances[].[InstanceId]' \
                --output text)

            regist_instance_ids+=("$regist_instance_id")
        done

        # register instance with elb
        ${aws} elb register-instances-with-load-balancer \
            --load-balancer-name ${elb_name} \
            --instances ${regist_instance_ids[@]} \
            || echo "ERROR. failed to registered ${regist_instance_id[@]} with ${elb_name}" | exit 1

        ## check in service
        regist_num=${#regist_instance_ids[@]}
        i=0
        while true
        do
            in_service=$(${aws} elb describe-instance-health --load-balancer-name ${elb_name} \
                --query 'length(InstanceStates[?State==`InService`].[State])')

            if [ ${in_service} = "${regist_num}" ]; then
                echo "OK. ${regist_servers[@]} is InService at ${elb_name}"
                unset regist_instance_ids
                break
            fi

            i=`expr $i + 1`
            sleep 5
        done
    done
}

register_instances_with_elb

elb_names と attach_servers の持たせ方を工夫するとメンテナンスとかで使えそうな気がしたので晒してみました。