안녕하세요 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 매트릭 모니터링 활성화
실습
구성도
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03003037/image.png)
템플릿 받은 후 IAM → 역할에서 AutoScaling 이 있는지 확인
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03003138/image-1.png)
있는 경우 CloudFormatiom 오류 방지를 위하여 템플릿을 수정해야 하며 80번째 줄의 AutoScaling 관련 부분을 삭제합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03003211/image-2-1024x150.png)
스택 생성해 주며, 파라미터는 빈값으로 하고 나머지도 그대로 진행하며 체크 값에 체크만 합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03003516/image-3.png)
Error 발생
- 아래와 같은 Error 발생함
[/Resources/attachGateway/cloud9Environment] ‘null’ values are not allowed in templates
아래와 같은 부분이 원인이었음
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03003708/image-4.png)
해결 방법
- 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 시작 템플릿 생성
시작 템플릿 -> 시작 템플릿 생성 들어갑니다.
이름 및 설명 기입합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004131/image-5-300x261.png)
AMI는 아마존 리눅스 2 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004157/image-6-300x177.png)
보안 그룹은 아래와 같이 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004237/image-7.png)
태그도 작성합니다.
- 키: Name, 값: Instance for EC2AutoScalingWorkshop
- 키: Env, 값: prod
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004317/image-8.png)
고급 세부 정보 클릭 후
IAM 인스턴스 프로파일은 아래와 같이 선택하며 없는 경우 CloudFormation 한 리전이 같은지 확인합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004348/image-9.png)
모니터링 활성화합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004415/image-10.png)
메타데이터 버전 변경합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004435/image-11.png)
사용자 데이터 복붙 후 시작 템플릿 생성 누릅니다.
#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 생성 → 이름 입력합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004529/image-12.png)
네트워크 매핑 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004557/image-13.png)
보안 그룹 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004622/image-14.png)
리스너 선택하며 리스너 TG 만드는 방법은 아래와 같습니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004643/image-15.png)
- TG생성
- 이름 입력 및 VPC만 확인 후 TG 생성합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004715/image-16.png)
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004726/image-17.png)
EC2 Auto Scaling 그룹
- Auto Scaling 그룹 생성 -> 시작 템플릿 또는 구성 선택합니다.
이름 및 템플릿 설정 합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004844/image-19.png)
- 인스턴스 시작 옵션 선택합니다.
CPU는 2CPU이며 메모리는 4 ~ 16 사이 인스턴스를 생성한다는 설정입니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004923/image-20.png)
선택 사항을 통하여 원하는 제조업체, 세대 등 선택 가능합니다
액셀러레이터에서 최대 0으로 한다는 건 GPU가 달린 인스턴스를 안 만들겠다는 뜻입니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03004954/image-21.png)
인스턴스 구매 옵션 또한 아래와 같이 설정합니다.
- 온디맨드는 무조건 2개 만들며 나머지는 스팟으로 생성한다는 뜻
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005031/image-22.png)
네트워크 설정합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005053/image-23.png)
- 고급 옵션 구성
ALB 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005133/image-24.png)
모니터링 활성화합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005157/image-25.png)
- 그룹 크기 및 크기 조정 구성
아래와 같이 크기 조정합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005237/image-26.png)
Auto Scaling 그룹 생성 후 ALB의 DNS 이름을 브라우저에서 검색을 하면 인스턴스 ID 와 타입이 나오는 것을 알 수가 있습니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005306/image-27.png)
Auto Scaling 그룹의 크기 조정 실습
수동 조정과 예약된 조정 실습
- 수동 조정
EC2 -> Auto Scaling 그룹 -> EC2AutoScalingWorkshopASG → 세부정보 → 편집에서 용량을 4에서 6으로 증가
(활동 탭에서 LOG 확인 가능)
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005455/image-28.png)
6EA 확인
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005514/image-29.png)
- 예약된 조정
Auto Scaling 탭 → 예약된 작업 → 예약된 작업 생성
아래와 같이 설정하면 인스턴스를 1EA 만 남겨둔다는 뜻이다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005618/image-30.png)
그러면 시간이 좀 지난 후 1EA 남아 있는 걸 알 수가 있다. (작업 기록에서 확인 가능)
*실습에 들어가기 앞서 다시 수동으로 원하는 용량 4, 최소 용량 2 , 최대 용량 12로 설정합니다.
대상 추적 크기 조정 실습
Auto Scaling탭 -> 동적 크기 조정 정책 -> 동적 크기 조정 정책 생성
- 대상 값은 평균 CPU 사용률이 50% 이상일 때 어떤 특정 일을 한다고 생각하면 된다
- 지표 유형을 ALB로 할 경우 대상그룹에 대해서 요청 수가 50을 넘으면 특정한 일을 한다고 보면 된다.
- 워밍업은 새로 생긴 인스턴스는 해당 시간 동안 포함하지 않는다라는 뜻이다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03005805/image-31.png)
생성을 하면 클라우드 워치에서 경보가 만들어진다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03010851/image-32.png)
기록을 보면 CPU가 임곗값 보다 낮기 때문에 4→3으로 3→2로 줄인다는 것을 알 수가 있다.
2에서 더 이상 안 줄이는 이유는 최소 용량을 2로 설정하였기 때문이다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011021/image-33.png)
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를 추가한 느 식으로 단계 별로 설정한다.
실습에 앞서 비활성화합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011137/image-34.png)
클라우드 워치 이동합니다.
알람을 설정해 줘야 하며 지표 선택 → EC2 -> Auto Scaling에서 아래와 같은 이름으로 되어있는 CPU를 선택합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011204/image-35.png)
추가 구성에서 데이터 포인트를 해석하면 2번 즉 2분 동안 2번 임곗값을 넘으면 알람이 울린다는 뜻이다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011235/image-36.png)
알림은 제거합니다.
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011254/image-37.png)
EC2 -> Auto Scaling 그룹 -> EC2AutoScalingWorkshopASG → Auto Scaling 탭 이동 → 동적 크기 조정 선택
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011307/image-38.png)
30 – 60 은 4증가
60 – 80 은 2 증가
80 이상은 1 증가
![](https://cdn.surmin.net/wp-content/uploads/2024/01/03011327/image-39.png)
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