티스토리 뷰

AutoScaling 을 이용한 AWS 유입 트래픽 증가 대응 방안 ( AWS CLI를 이용한 shell script )


(문의)

서버에 들어오는 리퀘스트 양이  불규칙한 유입이 발생.
이런경우 인스턴스 증설 작업을 손쉽게 하는 방안
 
현재 인스턴스 증설 작업을 하는 절차는 아래와 같다.
 
1.     현재 운영 서버의 AMI 생성
2.     AMI 생성 후 인스턴스 생성
3.     인스턴스 내 hosts 파일 등 미들웨어 엔진 설정 변경
4.     ELB 멤버 투입
 
수동 ScaleOut 발생할 경우, 위의 증설 과정에서 수동으로 작업이 행해지는 내용이 Auto Scaling 그룹 정책의 USERDATA에 스크립트에 포함되어 있기 때문에 소요 시간을 줄일 수 있을 걸로 판단
다만 수동으로 ScaleOut 을 실행한다면, 방송 시간 동안 ScaleIn 실행되지 않도록 설정이 가능해야 한다.

(설명)

scale out 하기 전에 AMI 를 생성하고 해당 AMI로 scale out하는 AWS CLI 명령어를 만들어야 합니다.
두가지 방향으로 정리합니다.
1. Script를 실행하면 AMI를 생성하고 Autoscaling Launch Configuration AMI 변경 후 해당 이미지로 scale-out 정책 시현
2. Script를 실행하면 단순히 CPU 정책에 걸려있는 조건과 같이 min, desire 값만 변경하여 scale-out

1. Script를 실행하면 AMI를 생성하고 Autoscaling Launch Configuration AMI 변경 후 해당 이미지로 scale-out 정책 시현
- script 마지막 4줄의 주석을 별도 script로 만들어서 scale-in script 구현

(Script)
- aws configure 에 access key를 이미 등록한 상태에서 다음 스크립트를 실행한다.

pwdd=`pwd`
export AWS_ACCESS_KEY_ID=???
export AWS_SECRET_ACCESS_KEY=????
#region=ap-northeast-2 # 리전
baseline_ec2_id="i-???" # AMI용으로 사용할 최종 Instance ID
autoscaling_group_name="bj-stkim-web-sg" ##오토스케일링 그룹 이름
ami_name="bj-stkim-web-MZ" ##AMI를 생성하기 위한 이름
instance_type="c5.large" ## Instance Type
instance_keyname="stkim_log" ## Instance Key 이름
instance_security="sg-06b5e6ce41984c3e6" ## Instance Security Group 복수 가능
ELB_Name="bj-stkim-web-elb" #연결될 ELB 이름



LDTime=`date '+%Y-%m-%dT%H-%M-%S'`
imgid=`aws ec2 create-image --instance-id ${baseline_ec2_id} --name "${ami_name}-${LDTime}" --no-reboot | grep ImageId | awk -F"|" '{print $3}'|sed -e 's/^ *//g' -e 's/ *$//g'`
LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${baseline_ec2_id} Instance의 ${imgid}(AMI)를 생성합니다."
echo "${LTime} : AMI 생성이 완료될때까지 대기중입니다.."
aws ec2 wait image-available --filters "Name=name,Values=${ami_name}-${LDTime}"
LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${imgid}(AMI)를 생성이 완료되었습니다."
LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : launch configuration을 생성합니다."

aws autoscaling create-launch-configuration --launch-configuration-name ${autoscaling_group_name}-${LDTime} --image-id ${imgid} --instance-type ${instance_type} --key-name ${instance_keyname} --security-groups ${instance_security} --block-device-mappings "[{\"DeviceName\": \"/dev/xvda\",\"Ebs\":{\"VolumeSize\":100}}]" --instance-monitoring Enabled=False

LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${autoscaling_group_name}-${LDTime} launch configuration을 생성이 완료되었습니다."

aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${autoscaling_group_name} --launch-configuration-name ${autoscaling_group_name}-${LDTime}


LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${autoscaling_group_name}의 Launch Configuration을 ${autoscaling_group_name}-${LDTime}으로 변경 완료했습니다."

aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${autoscaling_group_name} --desired-capacity 4 --max-size 20 --min-size 4

LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${autoscaling_group_name}의 desired 값을 4로 수정하였습니다."
echo "${LTime} : 30초간 Instance가 신규로 생성이 되는 것을 기다립니다.."
sleep 30;

autoasg=($(aws autoscaling describe-auto-scaling-instances --output text | grep ${autoscaling_group_name} | awk '{print $5}'))

for((i=0;i<${#autoasg[@]};i++))
do
LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${autoasg[$i]} 의 헬스체크를 시작합니다.."
aws ec2 wait instance-status-ok --instance-ids ${autoasg[$i]}
LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${autoasg[$i]} 의 헬스체크가 완료되었습니다."
done


LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${ELB_Name}에서 모든 Instance가 InService 중이 될때까지 기다립니다."

aws elb wait instance-in-service --load-balancer-name ${ELB_Name}


LTime=`date '+%Y-%m-%d %H:%M:%S'`
echo "${LTime} : ${ELB_Name}에서 모든 Instance가 InService가 되었습니다."

#aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${autoscaling_group_name} --desired-capacity 2 --max-size 20 --min-size 2

#LTime=`date '+%Y-%m-%d %H:%M:%S'`
#echo "${LTime} : ${autoscaling_group_name}의 Desired 값을 2로 수정하였습니다."
#echo "${LTime} : Scale-in 작업이 완료되었습니다."




(실행화면)


2. Script를 실행하면 단순히 CPU 정책에 걸려있는 조건과 같이 min, desire 값만 변경하여 scale-out / scale-in 구현
- 1번 설명했던 Script에서 Ami 생성부분을 제외하고 AutoScaling in / out 정책을 구현합니다.





댓글
댓글쓰기 폼