FAGATE_SPOT
사용하여 정가 대비 최대 70% 할인된 가격으로 서비스를 이용하여 비용 최적화를 구현할 수 있습니다.Dev 및 Stag 환경의 ECS FARGATE 작업에 대해서 스케줄을 적용하여 비용 최적화를 구현하고 있습니다.
더 나아가 Fargate_SPOT 용량 공급자로 적용하여 운영 비용을 최적화 하고자 합니다.
스팟 정책에 따라 운용되므로, FARGATE_SPOT 용량 공급자를 사용하면 작업이 중단될 수 있습니다.
용량 공급자를 통해 클러스터에서 AWS ECS가 확장, 또는 축소하는 클러스터의 용량을 사전에 정의하여 사용할 수 있습니다.
FARGATE
및 FARGATE_SPOT
용량 공급자는 클러스터 생성시 자동으로 설정됩니다.
FARGATE_SPOT
용량 공급자를 통해 FARGATE
컨테이너 작업 시 비용을 절감하여 운영할 수 있습니다.
운영 중인 Dev
및 Stag
환경의 FARGATE
에 적용하여 인스턴스의 비용을 최적화 할 수 있습니다.
FARGATE_SPOT
용량 공급자를 지원하지 않습니다.FARGATE_SPOT
용량 공급자를 지원하지 않습니다.FARGATE_SPOT
을 사용하는 경우 플랫폼 버전 1.3.0 이상(Linux용)을 사용해야 합니다.FARGATE
및 FARGATE_SPOT
용량 공급자를 사용하는 작업이 중지 되면 작업 상태 변경 이벤트가 Amazon EventBridge
로 전송됩니다. 중지된 이유는 원인을 설명합니다내부 시스템은 X86_64 아키텍처의 리눅스에서 운영 중이며, 사용 중인 플랫폼 버전은 1.3.0 이상 이므로 위의 고려 사항에 해당 되지 않습니다.
FARGATE는 기본적으로 vCPU 및 메모리에 대해서 사용량에 대한 요금을 지불합니다.
FAGATE_SPOT
사용하는 경우 정가에서 최대 70% 할인된 가격으로 서비스를 이용할 수 있습니다.
환경 - 서울 리전 (2023-01-30 기준)
vCPU(per hour) - 0.04656 USD
Memory GB(per hour) - 0.00511 USD
vCPU(per hour) - 0.01412301 USD
Memory GB(per hour) - 0.00155001 USD
EC2에 비해 FARGATE_SPOT는 손쉽게 구성할 수 있습니다.
[클러스터] - [클러스터 업데이트]에서 기본 용량 공급자 전략 FARGATE_SPOT
적용합니다.
단일로 구성가능하며, 일반 FARGATE 동시에 선택할 시
선택하여 전략을 구축할 수 있습니다.
예를 들어 중단에 대해 크리티컬하지 않지만, 비용을 최소화 하고 싶은 Dev / Stag 환경은 100% SPOT으로 구성할 수 있습니다.
추가적으로 안정적이지만, 단기적으로 늘어나는 트래픽을 감당하기 위한 방안을 고려할때, 기본적인 FARGATE 개수를 설정하고, 늘어나는 태스크는 SPOT으로 적용하여 비용최적화를 구현할 수 있습니다.
기존 구성된 서비스가 있다면, 시작 유형에서 하단의 용량 공급자 전략으로 전환
을 선택하여, 클러스터에서 설정한 용량 클러스터 전략으로 수정합니다.
용량 공급자 전략을 변경하고, 새 배포 적용으로 태스크를 생성하면 이후 생성되는 Fargate는 스팟으로 운용됩니다.
CLI를 이용하여 클러스터 생성 시 --capacity-providers
옵션 없이 생성할 경우 용량 공급자가 보이지 않습니다. 이를 해결하기 위해서는 아래의 명령을 이용해서 용량 공급자를 추가 할 수 있습니다.
aws ecs put-cluster-capacity-providers \
--cluster $CLUSTER_NAME \
--capacity-providers FARGATE FARGATE_SPOT \
--default-capacity-provider-strategy
예) dev 의 클러스터에 용량 공급자가 없는 경우
aws ecs put-cluster-capacity-providers \
--cluster dev \
--capacity-providers FARGATE FARGATE_SPOT \
--default-capacity-provider-strategy
AWS CLI 명령을 이용하여 용량 공급자를 생성합니다.
요청이 성공하면 아래와 같은 응답을 확인할 수 있습니다.
다시 콘솔창을 확인하면 용량 공급자가 정상적으로 생성된 것을 확인할 수 있습니다.
aws ecs create-cluster \
--cluster-name $CLUSTER_NAME \
--capacity-providers FARGATE FARGATE_SPOT \
--region $REGION
SPOT 사용으로 인해 AWS 측 용량 회수 시 ( 의도하지 않은 중단 발생 ) AWS 측에서 종료 2분 전에 알람을 보내줍니다.
이러한 알람을 적시에 확인하여 태스크가 중단 되기 전에 조치하기 위하여 Eventbridge와 연동하여 알람을 수신하고자 합니다.
ECS는 다음과 같은 포맷으로 이벤트를 Eventbridge에게 전달합니다.
{
"version": "0",
"id": "a99d3f53-4a7c-4153-a1a5-48957fc83b8f",
"detail-type": "ECS Task State Change",
"source": "aws.ecs",
"account": "1111222233334444",
"resources": [
"arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9b"
],
"detail": {
"clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
"createdAt": "2022-02-25T10:13:08.455Z",
"desiredStatus": "STOPPED",
"lastStatus": "RUNNING",
"stoppedReason": "Your Spot Task was interrupted.",
"stopCode": "SpotInterruption",
"taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
...
}
}
감시 파라미터는 다음과 같습니다.
"detail-type": "ECS Task State Change",
"stopCode": "SpotInterruption",
SNS에서 새 주제를 생성합니다.
이름은 FargateSpotAlert
으로 생성하겠습니다.
FARGATE_SPOT-INTERRUPTION
으로 이벤트의 이름을 지정(optional)하고 다음을 클릭합니다.
위에서 Fargate spot 이벤트 발생시 감시할 파라미터를 json 형태로 지정합니다.
{
"source": ["aws.ecs"],
"detail-type": ["ECS Task State Change"],
"detail": {
"stopCode": ["SpotInterruption"]
}
}
Step 01
에서 생성한 SNS 서비스를 지정하여 Eventbridge와 결합합니다.
위 과정이 모두 완료 되면, 스팟 용량 회수로 인한 강제 종료시에도 SNS로 구독중인 이메일이나, Lambda 등을 이용하여 Slack으로 메시지를 수신 하는 등 유연하게 대응할 수 있습니다.