업무 중 특정 고객사에서 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
'AWS' 카테고리의 다른 글
[EKS] External DNS 설치 및 사용하기 (0) | 2021.11.24 |
---|---|
[EKS] Terraform으로 EKS Cluster 생성 (2) | 2021.11.20 |
[Lambda] AWS에서 발생하는 Event를 Slack으로 알림 받기 (2) | 2021.11.06 |
[IAM] A 계정의 IAM 유저 리스트를 B 계정의 Lambda에서 조회하기 (Cross account - STS Assume role) (0) | 2021.10.23 |
[CICD / ECS] CodePipeline으로 ECS Fargate 배포 자동화 #6 - CodePipeline 설정 및 Blue/Green 배포 자동화 (0) | 2021.09.29 |