일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- JavaScript
- 설정
- ChatGPT
- unity
- docker
- Linux
- API
- logstash
- 유니티
- MSSQL
- error
- mariadb
- sample
- Git
- AWS
- 영어
- build
- 엘라스틱서치
- JS
- nodejs
- 구글
- Python
- MySQL
- Kibana
- s3
- Windows
- elasticsearch
- Ai
- ssh
- Today
- Total
가끔 보자, 하늘.
CDK로 AWS 인프라 구축하기 - #5 scale out 테스트 본문
이번에는 CDK로 구축한 서비스가 과부하 상태에서 ECS에 설정한 대로 부하를 잘 분산하는지 확인해 보겠습니다.
우선 ECR에 등록할 간단한 API 서비스를 만듭니다. 이 예제에서는 /calc 라는 인터페이스를 통해 랜덤한 수를 소인수분해하고 해당 결과를 돌려주도록 하는 샘플을 추가해 보았습니다. CPU 부하를 기준으로 스케일아웃을 설정할 것이므로 수초 동안 연산을 수행 후 결과를 돌려주도록 합니다.
import random
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def health_check():
return 200
@app.get("/calc")
async def funcCalc():
x = random.randrange(99999999, 999999999)
formula = str(x) +' = '
d = 2
while d <= x:
if x % d == 0:
formula += '' + str(d) + 'x'
x = x / d
else:
d = d + 1
if formula.strip()[-1] == 'x':
return formula[:-1]
else:
return formula
# requirements.txt
fastapi>=0.73.0
uvicorn>=0.17.5
이를 docker로 빌드, ecr에 등록하여 테스트 서비스로 사용하겠습니다. (docker desktop (link)) Dockerfile 내용은 아래와 같습니다. Dockerfile은 위 코드가 있는 폴더에 넣어주세요.
# from
FROM ubuntu:latest
# apt init
ENV LANG=C.UTF-8
ENV TZ=Asia/Seoul
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y sudo
# python stuff
RUN apt-get install -y python3-pip python3-dev
RUN cd /usr/local/bin && \
ln -s /usr/bin/python3 python && \
ln -s /usr/bin/pip3 pip && \
pip3 install --upgrade pip
# apt cleanse
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
# timezone
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . ./
# workspace
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
# install python packages
RUN pip install -r requirements.txt
# 이 예제에서는 서비스를 위해 3000번 포트를 사용합니다.
EXPOSE 3000
CMD uvicorn main:app --workers 4 --host=0.0.0.0 --port=3000
AWS Console에서 ECR로 가서 저장소를 추가합니다. 여기서는 hello-web이라는 이름으로 명명하겠습니다.
생성된 저장소를 클릭하면 우측 상단에 '푸시 명령 보기' 버튼을 눌러 보시기 바랍니다.
푸시 절차는 4단계로 각 단계 command를 copy&paste만 하면 push 가능합니다. -_-b
(*aws cli 가 설치되지 않았다면 1단계를 진행할 수 없습니다. aws cli 설치 link 설치 후 aws configure 설정이 필요합니다. 참고 link)
이제 이전에 살펴보았단 CDK 코드를 이번 테스트에 알맞게 수정합니다. 풀 소스는 Github link 에서 확인 하세요.
우선 저장소 정보를 수정합니다.
// 저장소를 생성했던 이름으로 맞춥니다.
const repository = ecr.Repository.fromRepositoryName(
this,
"your_aws_id",
"hello-web"
);
그리고 ECS Fargate 의 Auto scaling 설정을 추가합니다. 서비스를 1대로 시작(desiredCount)하고 최대 5개(maxCapacity)까지 증가하도록 설정합니다. AutoScaling을 cpu 평균 사용량 50%를 기준, 60초 이상 유지되면 인스턴스를 증가시키고, 180초 이상 기준량을 밑돌면 인스턴스를 자동으로 줄이도록 설정합니다.
.
.
// fargate Service 정의
const fservice = new ecs.FargateService(this, 'hello-web-service', {
cluster: cluster_web,
taskDefinition,
desiredCount:1,
circuitBreaker: {rollback: true}, // 비정상 서비스가 배포된 경우 자동으로 롤백되도록 설정
securityGroups : [listSG.web_3000_for_private],
serviceName : 'hello-web-ecs-service'
});
// AutoScaling 정책을 설정합니다.
const scaling = fservice.autoScaleTaskCount({ maxCapacity: 5 });
scaling.scaleOnCpuUtilization('CpuScaling', {
targetUtilizationPercent: 50,
scaleOutCooldown: Duration.seconds(60),
scaleInCooldown: Duration.seconds(180),
});
.
.
다 준비가 되었다면 배포를 해서 실제 API 서비스가 잘 작동하는지 확인합니다. 개발된 API 서비스는 'EC2 -> 로드밸런서'의 DNS 이름 A 레코드 값을 이용해 접속할 수 있습니다.
위 주소를 복사하여 웹 브라우저에서 /docs를 붙여 접속하여 /calc를 실행해보면 아래와 같은 결과를 확인할 수 있습니다. 그럼 테스트 준비는 완료되었습니다
ECS로 가면 아래와 같은 화면을 볼 수 있습니다. 현재 실행 중인 개수는 1개인 것을 확인할 수 있습니다. (아래 이미지에서는 테스트를 위해 진행했던 정보들이 있어 흔적이 남아 있네요. ^^)
부하테스트를 위해 locust를 사용해 보겠습니다.( 설치 및 안내 link) Python 이지만 크게 손볼 작업은 없습니다. 설치를 완료한 후 테스트를 위한 코드를 아래와 같이 작성합니다.
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 2) # 세션 별 task 를 실행하는 간격을 정의합니다.
@task # 생성된 세션은 wait_time 간격으로 @task로 정의된 함수들을 반복적으로 호출합니다.
def oper_clac(self):
self.client.get("/calc")
코드가 준비되었다면 아래와 같이 실행합니다.
> locust -f main.py
# 혹은 ..
> python3 -m locust -f main.py
# 실행하면 아래와 같은 텍스트가 출력됩니다.
D:\hello-test>python3 -m locust -f main.py
[2022-06-25 11:31:51,777] xxx/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2022-06-25 11:31:51,888] xxx/INFO/locust.main: Starting Locust 2.9.0
출력된 주소로 접속해보시면 이와 같은 화면을 확인할 수 있습니다.
Number of users에는 최대 세션 수를, Spawn rate에는 세션 추가되는 간격을 그리고 Host에는 접속 주소(http://를 추가하여 입력)를 입력 후 "Start swarming"을 누르면 테스트가 시작됩니다. 세션 수를 50개로 입력 후 테스트 진행하면 scale out되는걸 확인할 수 있으며, cpu 증가가 미미하다면 세션을 더 추가해 보시기 바랍니다. 이제 ECS의 서비스로 가서 "측정치" 탭을 다시 확인해 보시면 CPUUtilization이 증가된 것을 확인할 수 있습니다.
실행 중인 개수가 5개까지 늘어났다면 Locust 화면에서 "STOP"을 눌러 테스트를 종료합니다. 그럼 실행 중인 개수가 점차적으로 줄어 1개로 줄어드는 것을 확인할 수 있습니다.
이상으로 조금은 길었던 CDK 관련 글을 마칩니다. 미래의 저와 필요한 분들에게 도움이 되길 바랍니다. :)
'개발 이야기 > 인프라 구축 및 운영' 카테고리의 다른 글
Linux에서 AWS ECR Docker 이미지 설치하기 (0) | 2022.07.08 |
---|---|
CDK로 AWS 인프라 구축하기 - #마지막 (0) | 2022.06.28 |
CDK로 AWS 인프라 구축하기 - #4 ECS Cluster 구성 (0) | 2022.06.17 |
CDK로 AWS 인프라 구축하기 - #3 보안 그룹과 RDBMS (0) | 2022.06.14 |
CDK로 AWS 인프라 구축하기 - #2 VPC 생성 코드 작성하기 (31) | 2022.06.13 |