안녕하세요 surmin입니다 🙂
새해 복 많이 받으세요.
오늘은 AWS Auto Scaling에 대해 함께 배워보는 시간을 가져보겠습니다!
- https://catalog.workshops.aws/workshops/b7ae6081-c270-482f-af69-b476bf1f3654/ko-KR
- 해당 핸즈온 은 위의 링크인 Workshop Studio 기반으로 작성하였습니다.
Auto Scaling 란?
조건에 따라 EC2 인스턴스를 자동으로 추가 또는 제거하여 애플리케이션 가용성을 유지하는데 도움이 되는 완전 관리형 서비스
구성요소
- 시작 템플릿: 인스턴스 시작할때 파라미터 미리지정 함으로써 차후 재활용 함으로써 일일이 지정할 필요가 없음
- 그룹: 크기 조정 및 관리 목적으로 논리적인 그룹으로 구성
- 크기 조정 정책 : 크기를 조정하는 여러 방법들
크기 조정 방법
- 고정된 수 유지(인스턴수 변경x): 고정된 워크로도 가진 애플리케이션에 사용 가능
- 예약된 조정: 특정 시간에 반복적으로 동작하는 워크로드에 사용가능 (부하가 있을 시간에는 늘리고 없는 시간에는 줄이고)
- 예측 조정: 인스턴의 수요를 과거 패턴을 학습하여 예측된 수요에 앞서 인스턴스를 시작합니다.
EC2 오토스케일링으로 인스턴스가 증가되는 속도가 만족스럽지 않습니다. 어떻게 하면 갑작스런 트래픽 증가에도 빠르게 인스턴스를 증가 시킬 수 있을까요?
- 모니터링 간격이 너무 길어서
=> 모니터링 간격 단축
- 확장이 일어날 때 대기 시간이 김
=> 상태 확인 유예기간 조절
=> Auoto scaling 휴지 기간 조절
더 빨리 확장되도록 하려면?
- 미리 인스터스를 준비시킴 => Warm pool 준비
EC2 오토스케일링으로 인스턴스가 증가되는 속도가 만족스럽지 않습니다. 어떻게 갑작스런 트래픽 증가에도 빠르게 인스턴스를 증가 시킬 수 있을까요?
- CloudWatch 매트릭 모니터링 활성화
실습
구성도

템플릿 받은 후 IAM → 역할에서 AutoScaling 이 있는지 확인

있는 경우 CloudFormatiom 오류 방지를 위하여 템플릿을 수정해야 하며 80번째 줄의 AutoScaling 관련 부분을 삭제합니다.

스택 생성해 주며, 파라미터는 빈값으로 하고 나머지도 그대로 진행하며 체크 값에 체크만 합니다.

Error 발생
- 아래와 같은 Error 발생함
[/Resources/attachGateway/cloud9Environment] ‘null’ values are not allowed in templates
아래와 같은 부분이 원인이었음

해결 방법
- cloudformation 받으거에 92번째 줄에 ImageId: amazonlinux-2023-x86_64 추가하여 해결함
Cloud9 → 열림 클릭합니다.
코드 복붙 합니다.
# 기존 awscli 삭제
sudo pip uninstall -y awscli
# 새로운 버전의 awscli 설치 및 확인
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
# 추가 소프트웨어 설치
sudo yum -y install jq
git clone https://github.com/awslabs/ec2-spot-workshops.git
cd ec2-spot-workshops/workshops/ec2-auto-scaling-with-multiple-instance-types-and-purchase-options
export stack_name=EC2AutoScalingWorkshop
export AWS_REGION=$(curl --silent http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)
# load outputs to env vars
for output in $(aws cloudformation describe-stacks --stack-name $stack_name --query 'Stacks[].Outputs[].OutputKey' --output text)
do
export $output=$(aws cloudformation describe-stacks --stack-name $stack_name --query 'Stacks[].Outputs[?OutputKey==`'$output'`].OutputValue' --output text)
eval "echo $output : \"\$$output\""
done
EC2 시작 템플릿 생성
시작 템플릿 -> 시작 템플릿 생성 들어갑니다.
이름 및 설명 기입합니다.

AMI는 아마존 리눅스 2 선택합니다.

보안 그룹은 아래와 같이 선택합니다.

태그도 작성합니다.
- 키: Name, 값: Instance for EC2AutoScalingWorkshop
- 키: Env, 값: prod

고급 세부 정보 클릭 후
IAM 인스턴스 프로파일은 아래와 같이 선택하며 없는 경우 CloudFormation 한 리전이 같은지 확인합니다.

모니터링 활성화합니다.

메타데이터 버전 변경합니다.

사용자 데이터 복붙 후 시작 템플릿 생성 누릅니다.
#cloud-config
repo_update: true
repo_upgrade: all
packages:
- httpd
- curl
runcmd:
- [ sh, -c, "amazon-linux-extras install -y epel" ]
- [ sh, -c, "yum -y install stress-ng" ]
- [ sh, -c, "echo hello world. My instance-id is $(curl -s http://169.254.169.254/latest/meta-data/instance-id). My instance-type is $(curl -s http://169.254.169.254/latest/meta-data/instance-type). > /var/www/html/index.html" ]
- [ sh, -c, "systemctl enable httpd" ]
- [ sh, -c, "systemctl start httpd" ]
AWS Elastic Load Balancer 배포
Application Load Balancer 생성 → 이름 입력합니다.

네트워크 매핑 선택합니다.

보안 그룹 선택합니다.

리스너 선택하며 리스너 TG 만드는 방법은 아래와 같습니다.

- TG생성
- 이름 입력 및 VPC만 확인 후 TG 생성합니다.


EC2 Auto Scaling 그룹
- Auto Scaling 그룹 생성 -> 시작 템플릿 또는 구성 선택합니다.
이름 및 템플릿 설정 합니다.

- 인스턴스 시작 옵션 선택합니다.
CPU는 2CPU이며 메모리는 4 ~ 16 사이 인스턴스를 생성한다는 설정입니다.

선택 사항을 통하여 원하는 제조업체, 세대 등 선택 가능합니다
액셀러레이터에서 최대 0으로 한다는 건 GPU가 달린 인스턴스를 안 만들겠다는 뜻입니다.

인스턴스 구매 옵션 또한 아래와 같이 설정합니다.
- 온디맨드는 무조건 2개 만들며 나머지는 스팟으로 생성한다는 뜻

네트워크 설정합니다.

- 고급 옵션 구성
ALB 선택합니다.

모니터링 활성화합니다.

- 그룹 크기 및 크기 조정 구성
아래와 같이 크기 조정합니다.

Auto Scaling 그룹 생성 후 ALB의 DNS 이름을 브라우저에서 검색을 하면 인스턴스 ID 와 타입이 나오는 것을 알 수가 있습니다.

Auto Scaling 그룹의 크기 조정 실습
수동 조정과 예약된 조정 실습
- 수동 조정
EC2 -> Auto Scaling 그룹 -> EC2AutoScalingWorkshopASG → 세부정보 → 편집에서 용량을 4에서 6으로 증가
(활동 탭에서 LOG 확인 가능)

6EA 확인

- 예약된 조정
Auto Scaling 탭 → 예약된 작업 → 예약된 작업 생성
아래와 같이 설정하면 인스턴스를 1EA 만 남겨둔다는 뜻이다.

그러면 시간이 좀 지난 후 1EA 남아 있는 걸 알 수가 있다. (작업 기록에서 확인 가능)
*실습에 들어가기 앞서 다시 수동으로 원하는 용량 4, 최소 용량 2 , 최대 용량 12로 설정합니다.
대상 추적 크기 조정 실습
Auto Scaling탭 -> 동적 크기 조정 정책 -> 동적 크기 조정 정책 생성
- 대상 값은 평균 CPU 사용률이 50% 이상일 때 어떤 특정 일을 한다고 생각하면 된다
- 지표 유형을 ALB로 할 경우 대상그룹에 대해서 요청 수가 50을 넘으면 특정한 일을 한다고 보면 된다.
- 워밍업은 새로 생긴 인스턴스는 해당 시간 동안 포함하지 않는다라는 뜻이다.

생성을 하면 클라우드 워치에서 경보가 만들어진다.

기록을 보면 CPU가 임곗값 보다 낮기 때문에 4→3으로 3→2로 줄인다는 것을 알 수가 있다.
2에서 더 이상 안 줄이는 이유는 최소 용량을 2로 설정하였기 때문이다.

CPU 과부하 테스트를 위하여 Cloud9 들어간 후 아래의 명령어를 입력합니다.
cd ~/environment/ec2-spot-workshops/workshops/ec2-auto-scaling-with-multiple-instance-types-and-purchase-options
aws ssm send-command --cli-input-json file://ssm-stress.json
단계 크기 조정
- 말 그대로 단계를 나눠서 예로 들어 CPU 사용률이 30 ~ 50이면 3EA를 60 ~ 70이면 4EA를 추가한 느 식으로 단계 별로 설정한다.
실습에 앞서 비활성화합니다.

클라우드 워치 이동합니다.
알람을 설정해 줘야 하며 지표 선택 → EC2 -> Auto Scaling에서 아래와 같은 이름으로 되어있는 CPU를 선택합니다.

추가 구성에서 데이터 포인트를 해석하면 2번 즉 2분 동안 2번 임곗값을 넘으면 알람이 울린다는 뜻이다.

알림은 제거합니다.

EC2 -> Auto Scaling 그룹 -> EC2AutoScalingWorkshopASG → Auto Scaling 탭 이동 → 동적 크기 조정 선택

30 – 60 은 4증가
60 – 80 은 2 증가
80 이상은 1 증가

Cloud9 접속 후 아래의 코드 실행 후 확인합니다.
cd ~/environment/ec2-spot-workshops/workshops/ec2-auto-scaling-with-multiple-instance-types-and-purchase-options
aws ssm send-command --cli-input-json file://ssm-stress.json
자원 삭제 순서
Auto Scaling 그룹
시작 템플릿
로드 밸런서
대상 그룹
CloudFormation