AWS ECS Fargate task managing with schedule

개요

문제는 (거의) 항상 돈이다

일반적으로 ECS Fargate의 task 개수는 CloudWatch와 연결되어 CPU, Memory utilization 을 따라가게 되어있다.

하지만 여러 나라에서 서비스 되지 않는 등 이유로 일정 시간에만 서비스 사용률이 높은 경우, 사용률이 낮은 시간대의 task 개수가 필요 이상일 수 있다. 이럴 경우 서버가 놀게 되고 결론적으로는 비용이 낭비된다.

이때 유용한 것이 바로 시간대 별로 Fargate의 작업 개수를 조정하도록 하는 것이다. CloudWatch 규칙의 cron expression 과 Lambda를 잘 이용하면 어렵지 않게 구현할 수 있다.

단계

  1. 데이터 분석 후 일정 별 작업 개수 확정
  2. Fargate 서비스의 작업 개수를 재설정하는 Lambda 함수 작성
  3. IAM 권한 설정
  4. CloudWatch 규칙 등록
  5. 제대로 작동하는지 확인

구현

데이터 분석 및 일정 확정

요일, 시간대 별로 디비 접근 내역을 조사했다.

    for i in range(0, 7):
        for j in range(0,24):
            cur.execute(f"""
                SELECT count(t.*)
                FROM public.******** t
                WHERE 
                    (*******_time > '{current.strftime(dateform)}') AND
                    (*******_time < '{(current+hour).strftime(dateform)}')
            """)

python의 plot 모듈을 이용하면 그래프로 확인 가능해 좀 더 직관적으로 일정을 짜기에 좋다.

색깔은 주를 구분한다. 오후, 특히 주말 오후에 사용량이 치솟는게 한 눈에 보인다.
이러한 분석을 바탕으로 일정을 확정한다. (예시)

  • 20%: 평일/주말 00:00 ~ 10:00
  • 60%: 평일 10:00 ~ 24:00
  • 100%: 주말 10:00 ~ 24:00

Lambda 작성

{"count": 4} 와 같은 형태로 원하는 작업 개수를 받아 서비스의 작업 개수를 조정하는 lambda함수를 작성해 등록한다.

import boto3

def lambda_handler(event,context):
    client = boto3.client('ecs')

    response = client.update_service(
        cluster='******',
        service='******',
        desiredCount=event['count']
    )

    return event['count']

IAM 권한

lambda가 원하는 작업을 실행할 수 있게 권한을 부여해야 한다. 필요한 권한은 다음과 같다.

  • Lambda 기본 권한
  • ecs:UpdateService → *
        {
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateService"
            ],
            "Resource": "*"
        }

CloudWatch 규칙 등록

확정한 일정에 따라 작업 개수에 변화가 생기는 지점이 어느때인지 확인한 뒤 이에 맞추어 CloudWatch 일정 규칙을 생성한다.

이 예시의 경우 다음과 같이 작업 개수를 조정했다.

  • 평일/주말 00:00 → 2
  • 주말 10:00 → 6
  • 평일 10:00 → 4

CloudWatch 규칙 일정은 cron expression을 사용한다. 이때 주의해야 할 점은 시간대가 UTC라는 점이다.

  • 평일/주말 00:00
    Cron: 0 15 ? * * *
    Args: {"count": 2}
  • 주말 10:00
    Cron: 0 1 ? * SAT-SUN *
    Args: {"count": 6}
  • 평일 10:00
    Cron: 0 1 ? * MON-FRI *
    Args: {"count": 4}

Review

제대로 작동하는지 확인하기 위해서는 다음과 같이 하면 된다.

  1. CloudWatch에서 "지표" 탭에 들어간다.
  2. ECS → ClusterName, ServiceName에서 원하는 서비스의 지표 중 아무 것이나 선택한다.
  3. "그래프로 표시된 지표" 탭에서, 통계를 "샘플 수"로 설정하고 기간은 "1분"으로 설정한다.
  4. 그래프로 작업 개수 변화 양상을 확인할 수 있다.

결과

시간 당 작업 1개를 이용하는 것을 Fargate 사용률 1이라고 할 때, 원래 우리 서비스의 주간 Fargate 사용률은 2016이었다.

이 방법을 적용하고 나서 주간 Fargate 사용률은 1386이 되었다.

즉 ECS Fargate task로 인한 서버 비용을 원래의 68% 수준으로 절약했다.

좋은 웹페이지 즐겨찾기