AWS ECS Fargate task managing with schedule
개요
문제는 (거의) 항상 돈이다
일반적으로 ECS Fargate의 task 개수는 CloudWatch와 연결되어 CPU, Memory utilization 을 따라가게 되어있다.
하지만 여러 나라에서 서비스 되지 않는 등 이유로 일정 시간에만 서비스 사용률이 높은 경우, 사용률이 낮은 시간대의 task 개수가 필요 이상일 수 있다. 이럴 경우 서버가 놀게 되고 결론적으로는 비용이 낭비된다.
이때 유용한 것이 바로 시간대 별로 Fargate의 작업 개수를 조정하도록 하는 것이다. CloudWatch 규칙의 cron expression 과 Lambda를 잘 이용하면 어렵지 않게 구현할 수 있다.
단계
- 데이터 분석 후 일정 별 작업 개수 확정
- Fargate 서비스의 작업 개수를 재설정하는 Lambda 함수 작성
- IAM 권한 설정
- CloudWatch 규칙 등록
- 제대로 작동하는지 확인
구현
데이터 분석 및 일정 확정
요일, 시간대 별로 디비 접근 내역을 조사했다.
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
제대로 작동하는지 확인하기 위해서는 다음과 같이 하면 된다.
- CloudWatch에서 "지표" 탭에 들어간다.
- ECS → ClusterName, ServiceName에서 원하는 서비스의 지표 중 아무 것이나 선택한다.
- "그래프로 표시된 지표" 탭에서, 통계를 "샘플 수"로 설정하고 기간은 "1분"으로 설정한다.
- 그래프로 작업 개수 변화 양상을 확인할 수 있다.
결과
시간 당 작업 1개를 이용하는 것을 Fargate 사용률 1이라고 할 때, 원래 우리 서비스의 주간 Fargate 사용률은 2016이었다.
이 방법을 적용하고 나서 주간 Fargate 사용률은 1386이 되었다.
즉 ECS Fargate task로 인한 서버 비용을 원래의 68% 수준으로 절약했다.
Author And Source
이 문제에 관하여(AWS ECS Fargate task managing with schedule), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hanchchch/AWS-ECS-Fargate-task-managing-with-schedule저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)