ECS Scheduled Task
I. ECS Scheduled Task
Spring Batch, FastAPI Utilities등 WebFramework에서 스케줄링을 구현하는 방법은 다양하게 존재하지만, WebFramework 자원과 독립적으로 동작하는 기능이 필요한 경우도 분명 존재한다. AWS EchoSystem 내에서 스케줄링은 보통 *EventBridgeScheduler를 기반으로 하는데, ECS Scheduled Task 역시 EventBridgeScheduler와 연계해 ECS Task를 실행하는 기능이다. EventBridgeScheduler는 rate()
및 cron()
을 표현식을 지원하며, ECS Scheduled Task 역시 동일하게 스케줄링이 가능하다.
rate()
는 다음과 같은 형식으로 사용한다.
1
2
3
4
5
# Value: 양의 정수
# Unit: minutes, hour, days
rate(Value Unit)
# ex) rate(5 minutes): 매 5분마다 실행
cron()
은 다음과 같은 형식으로 사용한다.
1
2
3
cron(Minutes Hours Day-of-month Month Day-of-week Year)
# ex) cron(15 10 * * ? *): 매일 오전 10시 15분
*EventBridgeScheduler: 하나의 통합된 관리 환경에서 Task를 생성 및 실행할 수 있는 기능
II. Upload DockerImage on ECR
1. Dockerfile
Dockerfile은 ENTRYPOINT
지정을 통해 바로 컨테이너가 실행되도록 지정한다.
1
2
3
4
5
6
7
8
9
FROM python:3.11-slim
WORKDIR /usr/src/task
COPY . .
RUN pip install --no-cache-dir --upgrade -r /usr/src/task/requirements.txt
ENTRYPOINT ["python3", "/usr/src/task/main.py"]
ECS가 Docker 환경을 기반으로 하기 때문에, *ECR에 DockerImage를 업로드하는 과정이 필수적이다. 다양한 방법으로 ECR에 DockerImage를 업로드할 수 있는데, 이번엔 Git Action을 통해 업로드했다. (⚠ ECR Repository 생성 이후 Code Deploy 진행)
*ECR: Amazon Container Registry
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
32
33
34
35
36
37
38
39
40
41
42
43
44
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Create environment file
run: echo "${{ secrets.DEV_ENV }}" > ./core/env/.env
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build, tag, and push image to Amazon ECR
uses: docker/build-push-action@v2
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
with:
context: .
file: ./Dockerfile # path of DockerFile
push: true
tags: |
${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
# cache setting
cache-from: type=gha # Refer: https://docs.docker.com/build/ci/github-actions/cache/
cache-to: type=gha,mode=max
III. Create Task Definition
ECS Scheduled Task 이름 그대로, Task Definition
설정이 필수적이다. ECS
->Task Definition
에서 ECR에 업로드된 DockerImage를 실행할 Task Definition
을 생성해준다. Task Definition 생성 시 여러 컨테이너를 추가해 만들 수 있으므로, 필요한 경우 docker-compose처럼(?) 사용할 수도 있다.
생성된 Task Definition
을 json 형식으로 복사할 수 있다. 해당 json을 복사해 yaml 파일의 jobs에 다음과 같이 적용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
IV. Create ECS Scheduled Task
위 과정을 전부 거치고 나면, 자동 배포를 포함해 ECS Scheduled Task 사용 준비가 끝난다. ECS
-> Service
-> Cluster
에서 ECS Scheduled Task를 적용할 Cluster를
선택한다. (만약 ECS 환경이 도입되지 않은 상황이라면, 빠르게 Lambda 쪽으로 선회하는 걸 추천..) Cluster의
서비스 정보에서, 예약된 태스크 항목을 통해 새로운 ECS Scheduled Task를 등록할 수 있다.
등록 과정에서 앞서 이야기한 rate()
, cron()
표현식을 통해 스케줄을 지정할 수 있다.