AWS Auto Scaling: 클라우드 리소스를 자동으로 관리하는 방법

안녕하세요 surmin입니다 🙂
새해 복 많이 받으세요.
오늘은 AWS Auto Scaling에 대해 함께 배워보는 시간을 가져보겠습니다!

Auto Scaling 란?

조건에 따라 EC2 인스턴스를 자동으로 추가 또는 제거하여 애플리케이션 가용성을 유지하는데 도움이 되는 완전 관리형 서비스

구성요소

  • 시작 템플릿: 인스턴스 시작할때 파라미터 미리지정 함으로써 차후 재활용 함으로써 일일이 지정할 필요가 없음
  • 그룹: 크기 조정 및 관리 목적으로 논리적인 그룹으로 구성
  • 크기 조정 정책 : 크기를 조정하는 여러 방법들

크기 조정 방법

  • 고정된 수 유지(인스턴수 변경x): 고정된 워크로도 가진 애플리케이션에 사용 가능
  • 예약된 조정: 특정 시간에 반복적으로 동작하는 워크로드에 사용가능 (부하가 있을 시간에는 늘리고 없는 시간에는 줄이고)
  • 예측 조정: 인스턴의 수요를 과거 패턴을 학습하여 예측된 수요에 앞서 인스턴스를 시작합니다.

EC2 오토스케일링으로 인스턴스가 증가되는 속도가 만족스럽지 않습니다. 어떻게 하면 갑작스런 트래픽 증가에도 빠르게 인스턴스를 증가 시킬 수 있을까요?

  • 모니터링 간격이 너무 길어서

=> 모니터링 간격 단축

  • 확장이 일어날 때 대기 시간이 김

=> 상태 확인 유예기간 조절

=> Auoto scaling 휴지 기간 조절

더 빨리 확장되도록 하려면?

  • 미리 인스터스를 준비시킴 => Warm pool 준비

EC2 오토스케일링으로 인스턴스가 증가되는 속도가 만족스럽지 않습니다. 어떻게 갑작스런 트래픽 증가에도 빠르게 인스턴스를 증가 시킬 수 있을까요?

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/ec2-auto-scaling-cloudwatch-monitoring.html?icmpid=docs_ec2as_help_panel

  • CloudWatch 매트릭 모니터링 활성화


실습

구성도

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

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

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


  • 아래와 같은 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

위로 스크롤