본문 바로가기

AWS

[Shell Script] CLB 인스턴스 상태 및 등록, 해제하는 쉘 스크립트

반응형

업무 중 특정 고객사에서 CLB에 등록된 웹 서비스에서 배포 작업이 있을 때 팀 내 엔지니어가 서로 연락을 취하면서

1) CLB에 등록된 인스턴스 해제

2) A 웹 서비스 배포 및 서비스 재시작

3) CLB에 등록된 인스턴스 재등록

..

4) B 웹 서비스 동일 작업..

와 같은 작업을 하는 것을 보고 아래의 스크립트를 작성한 뒤 배포 개발자에게 최소한의 IAM Policy만을 부여한 IAM User로 쉘 스크립트를 돌리게 하면 어떨까 해서 작성하였다. (어려운 일은 아니지만 서로 연락하면서 시간 소비가 어느 정도 있다 보니...)

 

내가 주로 담당하는 업무는 아니기 때문에 개인적으로만 짜보았고 실 업무에 적용하지는 않았다.

혹여나 필요한 분이 있으시다면 필요한 부분 추가 및 수정해서 사용하면 될 것으로 생각한다.

(정말 대충 만든 쉘 스크립트라서 특별한 기능 및 에러 처리 등에 대한 부분이 미흡하기 때문임)

 

맨 위에 CLB_NAME이랑 PROFILE_NAME을 기입하고 4개의 함수를 미리 작성해놓는다.

 

status()

usage()

attach()

detach()

 

말 그대로 현재 CLB에 등록된 인스턴스 내역을 알려주는 함수이며, usage() 함수는 help 명령어라 생각하면 된다.

attach, detach 또한 말 그대로이다.

 

Linux의 getopts 명령어를 사용하였으며 -s와 -h는 별도 인자가 필요 없고

-a와 -d는 추가 인자가 필요하도록 : 표시를 해주었다.

 

-a와 -d에서는 아규먼트(인자)를 받게 되면 ${OPTARG}를 통해 받은 인자를 함수에서 사용할 수 있도록 하였음

 

그 외에는 AWS CLI 및 --query 옵션을 사용하여 적절히 파싱 및 루프를 돌려 처리해주었다.

 

#!/bin/bash

# CLB의 Target Instance를 변경하는 Script입니다.

CLB_NAME="TestCLB"
PROFILE_NAME="MyProfile"

status()
{
    # 1. CLB에 등록된 Instance를 배열로 저장
    instances=$(aws --profile ${PROFILE_NAME} elb describe-load-balancers \
    --load-balancer-name ${CLB_NAME} --query \
    'LoadBalancerDescriptions[].Instances[].{Id: InstanceId}' --output text)

    echo "Current Instances attached to CLB ${CLB_NAME}"
    cnt=1
        # instance를 반복문 돌음
    for instance_id in $instances; do

                # 상태 확인 (InService | OutOfService | Unknown)
                health_status=$(aws --profile ${PROFILE_NAME} elb describe-instance-health \\
                --load-balancer-name ${CLB_NAME} \\
                --instances ${instance_id} \\
                --query 'InstanceStates[].State' --output text)
                instance_name=$(aws ec2 describe-tags --profile ${PROFILE_NAME} \\
                --filters Name=resource-id,Values=${instance_id} Name=key,Values=Name \\
                --query "Tags[].Value" --output text)

        echo "Instance ${cnt} : ${instance_id}, Health : ${health_status} (${instance_name})"
        cnt=`expr $cnt + 1`
    done
}

# 사용법
usage()
{
        echo "==================Usage=================="
        echo "$0 -a {instance_id} | -d {instance_id} | -s"
        echo "<Options>"
        echo "  -a {instance_id}"
        echo "     : attach instance to classic load balancer ${CLB_NAME}"
        echo "  -d {instance_id}"
        echo "     : detach instance from classic load balancer ${CLB_NAME}"
        echo "  -s : Show attached instanced to classic load balancer ${CLB_NAME}"
        echo "  -h : Show help message"
        exit 1
}

attach()
{
        # Instance id가 OPTARG에 의해 attach 함수로 넘어온다.
        aws --profile ${PROFILE_NAME} elb register-instances-with-load-balancer \\
        --load-balancer-name ${CLB_NAME} \\
        --instances $instance_id
}

detach()
{
        # Instance id가 OPTARG에 의해 detach 함수로 넘어온다.
        aws --profile ${PROFILE_NAME} elb deregister-instances-from-load-balancer \\
    	--load-balancer-name ${CLB_NAME} \\
    	--instances $instance_id
}

while getopts a:d:sh opts; do
        case $opts in
        a)
                instance_id="${OPTARG}"
                if [[ -n "$instance_id" ]]; then
                        attach
                else
                        echo "You need to specify instasnce id."
                        echo ""
                        usage
                fi
                ;;
        d)
                instance_id="${OPTARG}"
                detach
                ;;
        s)
                status
                ;;
        h)
                usage
                ;;
        esac
done

 

./change_clb_instance.sh -s

=> CLB에 등록된 인스턴스 내역과 Name 태그를 보여준다.

 

./change_clb_instance.sh -a {instance_id}

=> CLB에 인스턴스를 등록해준다.

 

./change_clb_instance.sh -d {instance_id}

=> CLB에 등록된 인스턴스를 해제해준다.

 

 

만약 getopts 커맨드를 사용하고 싶지 않다거나, -h, --help의 형태로도 사용하고 싶다면 아래 Stackoverflow를 참고하면 될 것이다.

 

https://stackoverflow.com/questions/5474732/how-can-i-add-a-help-method-to-a-shell-script

 

How can I add a help method to a shell script?

How do I check if a -h attribute has been passed into a shell script? I would like to display a help message when a user calls myscript.sh -h.

stackoverflow.com

 

반응형