[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


이상입니다.


감사합니다.