포스트

ECS Scheduled Task

I. ECS Scheduled Task

Spring Batch, FastAPI Utilities등 WebFramework에서 스케줄링을 구현하는 방법은 다양하게 존재하지만, WebFramework 자원과 독립적으로 동작하는 기능이 필요한 경우도 분명 존재한다. AWS EchoSystem 내에서 스케줄링은 보통 *EventBridgeScheduler를 기반으로 하는데, ECS Scheduled Task 역시 EventBridgeScheduler와 연계해 ECS Task를 실행하는 기능이다. EventBridgeSchedulerrate()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 (그림 III-1) TaskDefinition

생성된 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를 등록할 수 있다.

scheduled task (그림 IV-1) ScheduledTask

등록 과정에서 앞서 이야기한 rate(), cron() 표현식을 통해 스케줄을 지정할 수 있다.

cron (그림 IV-2) rate, cron

V. References

  1. rate(), cron()
  2. ECS Scheduling
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.