AWS ECS fargate를 사용한 Appilication 배포 - 2

지난 글에서는 Fargate를 통해 Appilication을 배포하였고 본 글에서는 Appilication이 도커 이미지 또는 작업이 업데이트 되는 경우와 기타 옵션들에 대해 좀 더 자세히 확인하도록 하겠습니다.


웹 어플리케이션 업데이트

지난 글에는 간단하게 웹에 접근했을 때 "Hello World!"를 출력하였는데 /welcome 으로 접근할때는 "Welcome!"을 출력하는 엄청난 기능을 추가하였습니다.
# hello.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

@app.route("/welcome")
def hello():
return "Welcome!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)



소스가 업데이트 되었으니 지난글에서와 같이 우선 ECR에 푸쉬 하도록 하겠습니다.

푸쉬 명령어 4개 중에 1번의 로그인 과정은 최초 로그인 후 12시간이 지속되니 로그인 세션이 남아있다면 생략 가능 합니다. 추가로 푸쉬전에 태깅을 할때 latest로 태깅을 하면 지난 푸쉬 이미지 Tag과 겹치니 버전과 같은 고유한 숫자, 문자등으로 식별할 수 있도록 구분하여 태깅합니다. 

이번 푸쉬 명령어에서는 최초에서 변경된 내용만 업데이트 되었습니다.


(venv) user:~/hello_app$ docker build -t fargatedemo/helloapp .

Sending build context to Docker daemon  67.66MB

Step 1/8 : FROM python:alpine

 ---> 1a8edcb29ce4

Step 2/8 : LABEL Name=flaskapp Version=0.0.1

 ---> Using cache

 ---> 840ae2afa937

...(중략)...

Successfully built 74b72d5f1369

Successfully tagged fargatedemo/helloapp:latest

(venv) user:~/hello_app$  

(venv) user:~/hello_app$ docker tag fargatedemo/helloapp:latest 111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/fargatedemo/helloapp:revision3
(venv) user:~/hello_app$
(venv) user:~/hello_app$ docker push 111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/fargatedemo/helloapp:revision3
The push refers to repository [111111111111.dkr.ecr.ap-northeast-2.amazonaws.com/fargatedemo/helloapp]
f2ea5f782ba9: Pushed 
767a8a839569: Pushed 
cb0f6e36ebca: Pushed 
7158e09cb118: Layer already exists 
8643e4accddc: Layer already exists 
43e8a7decf15: Layer already exists 
7484166a246c: Layer already exists 
1c862c0e1a30: Layer already exists 
7bff100f35cb: Layer already exists 
latest: digest: sha256:d192735e68903be86a6f9bc0c33c55c16c4d123640571b11da53c0c1220ccf54 size: 2200
(venv) user:~/hello_app$


푸쉬가 끝난 후 ECR에서 repository를 확인하면 다음과 같이 image가 추가 되어 있습니다.



새로운 이미지를 생성하였으니 작업정의도 업데이트가 필요 합니다. 업데이트를 하기 위하여 작업정의 항목에서 지난글에서 작성한 작업정의를 체크한 후 새 개정 생성을 클릭합니다.



지난글에서 작성하였던 작업정의 생성 화면과 거의 유사한 설정 화면이 나옵니다. 설정한 것들은 현재는 크게 바뀌지 않았고 소스 코드가 담긴 도커 이미지가 바뀌었으니 하단에 컨테이너 정의 항목으로 이동하여 해당 컨테이너를 클릭하여 설정화면이 나오면 이미지의 URL을 새로 업데이트 된 이미지의 URL로 변경합니다.



다음은 컨테이너 항목 창에서 업데이트를 클릭하여 나온 후 최하단의 생성 버튼을 눌러서 새 개정을 생성해 주면 다음과 같이 개정이 추가 됩니다.

추후에도 개정을 도커이미지 업데이트(소스 변화)에 따라 생성시 버젼별로 작업을 관리 할 수도 있고 서비스 업데이트 후 문제가 발생시 지난 버전의 작업으로 빠르게 롤백이 가능합니다.



새로운 작업정의를 바탕으로 서비스도 업데이트가 필요 합니다. 서비스 업데이트를 위해 클러스터 항목에서 지난글에서 작성한 서비스가 포함된 클러스터를 클릭하면 다음과 같이 클러스터에 대한 상세 정보가 표시 됩니다. 업데이트를 할 서비스를 체크 후 업데이트 합니다.



서비스 생성시 화면과 유사한 1단계 설정 화면이 표시되는데 Revision을 최신 버전으로 변경하고 새 배포 적용에 체크를 하고 다음 단계로 넘어갑니다.

추가로 2단계 네트워크 설정 및 3단계 오토스케일링도 변동이 없다면 4단계 검토 화면까지 넘어가서 서비스 업데이트를 적용합니다.



서비스가 업데이트 되면 Fargate는 작업 개수, 최소 정상 상태 백분율, 최대 백분율 배포를 수행합니다.

배포 중에 배포 화면은 다음과 같이 새로 배포된 작업정의 개정이 PRIMARY이지만 기존 작업도 실행하다 안정화 된 후 제외됩니다.



역시 작업탭에서도 Task2의 기존 작업 외에 Task 3이 프로비저닝 -> 펜딩 -> 런닝 상태로 진행 되어 정상 작동시 서비스를 인계 후 기존 작업은 추후에 중지 됩니다.



서비스 업데이트 후 추가로 한 /welcome 경로에 대한 서비스가 추가 되었습니다.


부록

배포 관련 옵션

지난 글에서 배포 관련 옵션인 작업 개수, 최소 정상 상태 백분율, 최대 백분율 배포에 대하여 간략하게 넘겼는데 다음과 같습니다.

작업 개수 - 사용자가 원하는 평상시 원하는 실제 서비스 작업 숫자

최소 정상 상태 백분율 - 작업 개수 대비 배포가 진행중 작업의 stuatus RUNNING의 필수 백분율

최대 백분율 - 작업 개수 대비 배포 진행되는중 PROVISIONING, RUNNING, PENDING 등의 모든 상태가 가능한 백분율


예를 들면 작업개수가 2 이고 최소가 50, 최대가 100이면 배포를 진행하기 위해 이미 실행중이던 작업 하나를 중단하는 상황이 발생 합니다.

최소와 최대의 비율에 따라 대략적으로 아래표와 같이 진행합니다.

결론은 클러스터 자원을 적게 하기 위해서는 1~2번 방법을 가용성을 위해서는 3~4번을 사용하면 되겠습니다.

다만 Fargate 특성상 초단위로 사용한 비용만 청구 되고 실제 4번 단계로 진행되어도 작업개수의 200%로 작업이 진행되는 10분 내외이기 때문에 최대 백분율은 default인 200%가 좋을듯 합니다.

 

 최소정상상태

 최대 백분율

 작업 분류

 배포전

 단계 1

 단계 2

 단계 3

 단계 4

50% 

 100%

 기존 작업

 2(success)

 1(success)

 1(success)

 

 

 배포 대상 작업

 

 

 1(success)

 1(success)

 2(success)

 50% 

150% 

 기존 작업

 2(success)

 2(success)

 1(success)

 

 

 배포 대상 작업

 

 1(pending)

 1(pending)

 1(success) 1(pending)

 2(success)

 100%

150% 

 기존 작업

 2(success)

 2(success)

 1(success) 

1(success)  

 

 배포 대상 작업

 

 1(pending)

 1(success) 1(pending)

 2(success)

 2(success)

 100%

 200%

 기존 작업

 2(success)

 2(success)

 2(success)

 

 

 배포 대상 작업

 

 2(pending)

 2(success)

 2(success)

 


스케일 업

AWS 컴퓨팅 자원들은 트래픽이 증가할 경우 AutoScaling을 통해 자동으로 Scale-Out 을 구현할 수 있습니다. Fargate는 Scale-Out은 물론 Scale-Up도 운영에 큰 부담이 가지 않게 적용 가능합니다. 개발용이나 초창기 어플리케이션은 최하 사양으로도 사용하다 규모나 사용성이 올라가면 손쉽게 Scale-Up을 할 수 있는 것입니다.

상단에서 작업했던 작업 정의에서 새 개정을 생성시 vCPU 및 메모리를 다시 설정할 수 있는데 아래 사진처럼 새 개정 생성을 만들고 새로운 개정을 통해 서비스를 재시작 하기만 하면 위에서 도커 이미지를 업데이트 한것과 같이 Fargate에서 자동으로 작업을 전환합니다.




+ Recent posts