[Intro]
MSP 업무를 진행하며 AutoScaling을 사용하는 고객사 중 주기적으로 AMI를 교체 해야하는 고객사가 있었습니다.
이러한 반복적인 작업을 줄이고자 쉘 스크립트를 작성하였으며, 각 고객사들마다 백업 하는 방법이 다양하기 때문에 EC2 Instance 태그 값 기준으로 AutoScaling AMI를 자동으로 교체하는 쉘 스크립트를 작성하게 되었습니다.
적용 고객사 및 아젠다는 하기와 같으며, 업무간 많이 활용해주시면 감사하겠습니다.
[ASG AMI 교체 자동화 고객사]
- 이퓨전아이(KBS재난포털)
[Shell Script 첨부파일]
- autoscaling_lc_exchange.sh
- remove_old_log.sh
[Agenda]
1. AWS CLI 적용
2. EC2 Instance IAM Role 적용
3. EC2 Instance 태그 값 지정
4. 쉘 스크립트 작성(AutoScaling LC 자동 삭제 포함)
5. 쉘 스크립트 실행 및 확인
6. crontab 로그 삭제 쉘 스크립트 작성
7. crontab 등록(3번, 4번 포함)
[내용]
Chapter 1. AWS CLI 적용
$ aws configure
[AWS Access Key ID]: ********* → Access Key ID 값 기입
[AWS Secret Access Key]: ********** → Secret Access Key 값 기입
[Default region name]: ap-northeast-2 → 리전 값 기입
[Default output format]: json → aws cli명령어를 쳤을 때 원하는 output format 값 기입(대표적으로 json 기입)
Chapter 2. EC2 Instance IAM Role 적용
- Role 생성
- 정책 연결
→ AmazonEC2FullAccess
→ AutoScalingFullAccess
- EC2 Instance IAM Role 적용
Chapter 3. EC2 Instance 태그 값 지정
- Key: autoscaling
- Value: true
Chapter 4. 쉘 스크립트 작성(AutoScaling LC자동 삭제 포함)
→ 볼트체 노란색 형광으로 표기된 값 변경 요망
autoscale_group_name=(AutoScaling 이름 기입)
instance_role=(EC2 Instance 적용된 IAM Role 기입)
home_dir=경로 기입
Values=EC2 Instance 태그에 추가한 Key 값 기입
case ${line} in
Test)
→ instance_name-list 값 기입(확인방법: aws ec2 describe-instances --filters "Name=tag-key,Values=autoscaling " --query "Reservations[].Instances[].{Name:Tags[?Key=='Name']|[0].Value}")
--instance-type m5.large → 환경에 맞게 Instance type 변경
$ sudo mkdir /root/autoscaling
$ sudo vim /root/autoscaling/autoscaling_lc_exchange.sh
#!/bin/bash
# Exchange ASG LC
date=$(date "+%Y%m%d")
now=$(date +"%y-%m-%d %T")
today_date=$(date +"%Y-%m-%d")
autoscale_group_name=(autoscalinggroup) # Modify
# key_pair=()
instance_role=(AutoScaling-Role) # Modify
volumetype=(gp2)
encrypte=(false)
deleteontermination=(true)
home_dir=/root/autoscaling # Modify
instance_name_list=$(aws ec2 describe-instances --filters "Name=tag-key,Values=autoscaling" --query "Reservations[].Instances[].{Name:Tags[?Key=='Name']|[0].Value}" --output text > $home_dir/instance_name_list)
cat $home_dir/instance_name_list|while read line; do
instance_sg_list=$(aws ec2 describe-instances --filters "Name=tag-key,Values=autoscaling " "Name=tag:Name,Values=$line" --query "Reservations[].Instances[].SecurityGroups[*].{sg_id:GroupId}" --output text)
ami_id_list=$(aws ec2 describe-images --filters "Name=tag:Name,Values=$line" --query "sort_by(Images, &CreationDate)[-1].ImageId" --output text)
# ami_cre_time=$(aws ec2 describe-images --filters "Name=tag-key,Values=DeleteOn" "Name=tag:Name,Values=$line"_Weekly_AMI_"$today_date" --query "Images[*].{cre_time:CreationDate}" --output text| cut -c 1-10)
block_device=(`aws ec2 describe-instances --filters "Name=tag-key,Values=autoscaling " "Name=tag:Name,Values=$line" --query "Reservations[].Instances[].BlockDeviceMappings[*].{device_name:DeviceName}" --output text`)
case ${line} in
Test) # Modify
echo "[$now] Start create-launch-configuration $line" >> $home_dir/update_launch_configurations.log.$date 2>&1
aws autoscaling create-launch-configuration --launch-configuration-name $line-$today_date --image-id $ami_id_list --instance-type m5.large --iam-instance-profile ${instance_role[0]} --instance-monitoring Enabled=false --security-groups $instance_sg_list --block-device-mappings "[{\"DeviceName\": \"${block_device[0]}\",\"Ebs\":{\"VolumeSize\":8,\"DeleteOnTermination\":${deleteontermination[0]},\"VolumeType\":\"${volumetype[0]}\",\"Encrypted\":${encrypte[0]}}}]"
echo "[$now] Finish create-launch-configuration $line" >> $home_dir/update_launch_configurations.log.$date 2>&1
sleep 10
echo "[$now] Start update-auto-scaling-group $line" >> $home_dir/update_launch_configurations.log.$date 2>&1
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${autoscale_group_name[0]} --launch-configuration-name $line-$today_date
echo "[$now] Finish update-auto-scaling-group $line" >> $home_dir/update_launch_configurations.log.$date 2>&1
;;
esac
done
# Delete ASG LC
date2=$(date "+%Y-%m-%d" -d "-3 days")
autoscaling_launch_config_list=$(aws autoscaling describe-launch-configurations --query 'LaunchConfigurations[?(CreatedTime<=`'$date2'`)].[LaunchConfigurationName]' --output text > $home_dir/autoscaling_launch_config_list)
cat $home_dir/autoscaling_launch_config_list|while read line2; do
aws autoscaling delete-launch-configuration --launch-configuration-name $line2
done
Chapter 5. 쉘 스크립트 실행 및 확인
$ sudo chmod 700 autoscaling_lc_exchange.sh
$ sudo /root/autoscaling/autoscaling_lc_exchange.sh
[ASG LC]
[AutoScaling Group]
Chapter 6. crontab 로그 삭제 쉘 스크립트 작성
$ sudo vim /root/autoscaling/remove_old_log.sh
#!/bin/bash
day=10 # 10일 지난 log는 자동 삭제 (변경 요망)
cron_log=/var/log/cron-20*
update_lc_log=/root/autoscaling/update_launch_configurations.log.20*
find ${cron_log} -mtime +${day} -type f -ls -exec rm -f {} \;
find ${update_lc_log} -mtime +${day} -type f -ls -exec rm -f {} \;
Chapter 7. crontab 등록
$ sudo vim /etc/crontab
분 시 일 월 요 사용자 경로
0 05 * * * root /root/autoscaling/autoscaling_lc_exchange.sh # 매일 05시 autoscaling_lc_exchange.sh 실행
0 06 * * * root /root/autoscaling/remove_old_log.sh # 매일 06시 remove_old_log.sh 실행
--------------------------------------------------------------------------------------------------------------------------
$ sudo chmod 700 /root/autoscaling/remove_old_log.sh
이상입니다.
감사합니다.