반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

가끔 보자, 하늘.

CDK로 AWS 인프라 구축하기 - #5 scale out 테스트 본문

개발 이야기/인프라 구축 및 운영

CDK로 AWS 인프라 구축하기 - #5 scale out 테스트

가온아 2022. 6. 21. 12:40

이번에는 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 관련 글을 마칩니다. 미래의 저와 필요한 분들에게 도움이 되길 바랍니다. :)

 

 

반응형