[AWS] Fargate spot 비용 최적화

xgro·2023년 1월 20일
1

AWS

목록 보기
11/19
post-thumbnail

📌 Summary

  • FAGATE_SPOT 사용하여 정가 대비 최대 70% 할인된 가격으로 서비스를 이용하여 비용 최적화를 구현할 수 있습니다.

📌 Purpose

Dev 및 Stag 환경의 ECS FARGATE 작업에 대해서 스케줄을 적용하여 비용 최적화를 구현하고 있습니다.

더 나아가 Fargate_SPOT 용량 공급자로 적용하여 운영 비용을 최적화 하고자 합니다.



📌 FARGATE_SPOT 용량 공급자란?

스팟 정책에 따라 운용되므로, FARGATE_SPOT 용량 공급자를 사용하면 작업이 중단될 수 있습니다.

용량 공급자를 통해 클러스터에서 AWS ECS가 확장, 또는 축소하는 클러스터의 용량을 사전에 정의하여 사용할 수 있습니다.

FARGATEFARGATE_SPOT 용량 공급자는 클러스터 생성시 자동으로 설정됩니다.

FARGATE_SPOT 용량 공급자를 통해 FARGATE 컨테이너 작업 시 비용을 절감하여 운영할 수 있습니다.

운영 중인 DevStag 환경의 FARGATE에 적용하여 인스턴스의 비용을 최적화 할 수 있습니다.


👉 용량 공급자 선택시 고려 사항

  1. Windows 컨테이너는 FARGATE_SPOT 용량 공급자를 지원하지 않습니다.
  2. ARM64 아키텍처는 FARGATE_SPOT 용량 공급자를 지원하지 않습니다.
  3. FARGATE_SPOT을 사용하는 경우 플랫폼 버전 1.3.0 이상(Linux용)을 사용해야 합니다.
  4. FARGATEFARGATE_SPOT 용량 공급자를 사용하는 작업이 중지 되면 작업 상태 변경 이벤트가 Amazon EventBridge로 전송됩니다. 중지된 이유는 원인을 설명합니다

내부 시스템은 X86_64 아키텍처의 리눅스에서 운영 중이며, 사용 중인 플랫폼 버전은 1.3.0 이상 이므로 위의 고려 사항에 해당 되지 않습니다.


👉 COST

FARGATE는 기본적으로 vCPU 및 메모리에 대해서 사용량에 대한 요금을 지불합니다.

FAGATE_SPOT 사용하는 경우 정가에서 최대 70% 할인된 가격으로 서비스를 이용할 수 있습니다.

환경 - 서울 리전 (2023-01-30 기준)

✅ FARGATE

vCPU(per hour) - 0.04656 USD

Memory GB(per hour) - 0.00511 USD

✅ FARGATE_SPOT

vCPU(per hour) - 0.01412301 USD

Memory GB(per hour) - 0.00155001 USD



📌 FARGATE_SPOT 적용하기

EC2에 비해 FARGATE_SPOT는 손쉽게 구성할 수 있습니다.

👉 ECS 콘솔에서 구성하는 경우

[클러스터] - [클러스터 업데이트]에서 기본 용량 공급자 전략 FARGATE_SPOT 적용합니다.

단일로 구성가능하며, 일반 FARGATE 동시에 선택할 시

  1. 기본적으로 몇개의 태스크에 해당 용량공급자를 사용할 것 인지?
  2. 운영 개수가 늘어날 시 가중치의 비율에 따라 몇 대 몇의 비율로 운용할 것 인지?

선택하여 전략을 구축할 수 있습니다.

예를 들어 중단에 대해 크리티컬하지 않지만, 비용을 최소화 하고 싶은 Dev / Stag 환경은 100% SPOT으로 구성할 수 있습니다.

추가적으로 안정적이지만, 단기적으로 늘어나는 트래픽을 감당하기 위한 방안을 고려할때, 기본적인 FARGATE 개수를 설정하고, 늘어나는 태스크는 SPOT으로 적용하여 비용최적화를 구현할 수 있습니다.

👉 서비스 구성

기존 구성된 서비스가 있다면, 시작 유형에서 하단의 용량 공급자 전략으로 전환 을 선택하여, 클러스터에서 설정한 용량 클러스터 전략으로 수정합니다.

용량 공급자 전략을 변경하고, 새 배포 적용으로 태스크를 생성하면 이후 생성되는 Fargate는 스팟으로 운용됩니다.



📌 Trouble shooting

👉 용량 공급자가 없는 경우

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 명령을 이용하여 용량 공급자를 생성합니다.

요청이 성공하면 아래와 같은 응답을 확인할 수 있습니다.

다시 콘솔창을 확인하면 용량 공급자가 정상적으로 생성된 것을 확인할 수 있습니다.

👉 클러스터 생성시 FARGATE 및 FARGATE_SPOT 용량 공급자를 생성하는 코드

aws ecs create-cluster \
    --cluster-name $CLUSTER_NAME \
    --capacity-providers FARGATE FARGATE_SPOT \
    --region $REGION



📌 Event Bridge 연동

SPOT 사용으로 인해 AWS 측 용량 회수 시 ( 의도하지 않은 중단 발생 ) AWS 측에서 종료 2분 전에 알람을 보내줍니다.

이러한 알람을 적시에 확인하여 태스크가 중단 되기 전에 조치하기 위하여 Eventbridge와 연동하여 알람을 수신하고자 합니다.

👉 Fargate Spot 중단으로 인해 FARGATE_SPOT 태스크가 종료된 경우

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",

✅ Step 01. SNS 주제 생성하기

SNS에서 새 주제를 생성합니다.

이름은 FargateSpotAlert 으로 생성하겠습니다.

✅ Step 02. Eventbride의 규칙을 생성합니다.

✅ Step 03. 이벤트 이름 정하기

FARGATE_SPOT-INTERRUPTION 으로 이벤트의 이름을 지정(optional)하고 다음을 클릭합니다.

✅ Step 04. 이벤트 패턴 삽입

위에서 Fargate spot 이벤트 발생시 감시할 파라미터를 json 형태로 지정합니다.

{
  "source": ["aws.ecs"],
  "detail-type": ["ECS Task State Change"],
  "detail": {
    "stopCode": ["SpotInterruption"]
  }
}

✅ Step 05. 대상 선택

Step 01 에서 생성한 SNS 서비스를 지정하여 Eventbridge와 결합합니다.

위 과정이 모두 완료 되면, 스팟 용량 회수로 인한 강제 종료시에도 SNS로 구독중인 이메일이나, Lambda 등을 이용하여 Slack으로 메시지를 수신 하는 등 유연하게 대응할 수 있습니다.



📌 Reference

  1. Amazon Web Services 한국 블로그 - https://aws.amazon.com/ko/blogs/korea/aws-fargate-spot-now-generally-available/
  2. AWS Fargate Spot 태스크에서 스팟 종료 알림을 처리하는 방법 - https://aws.amazon.com/ko/premiumsupport/knowledge-center/fargate-spot-termination-notice/
profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글