Info

25년 1월 작업 내용을 간단히 요약한 글입니다.

문제 상황

회사의 일부 리소스가 배포되지 않는 이슈가 있었습니다.
해당 리소스는 비용 절감을 위해 리소스를 최소한만 일반 인스턴스를 사용하고 나머지는 Spot(스팟) 인스턴스를 사용하는 것을 의도했지만, 실제 설정은 그렇지 않았습니다.

문제 원인

인스턴스를 배치하는 코드는 다음과 같았습니다.

some_task = self.client.run_task(
    # ...
    capacityProviderStrategy=[
        {
            "capacityProvider": "FARGATE_SPOT",
            "weight": 1,
        },
        {
            "capacityProvider": "FARGATE",
        },
    ],
)

여기서 weight의 기본값은 0이며, FARGATE_SPOT에만 weight 값을 주었기 때문에
의도와 다르게 모든 리소스가 Spot 인스턴스로 띄워졌습니다.
마침 해당 리전의 Spot 인스턴스 제한이 걸렸기 때문에 리소스가 배포되지 않았던 것으로 판단됩니다.

해결 방법

확인해 본 결과 관련해서 AWS에서 공식적으로 제공하는 Fallback 기능은 없는 것으로 보이며, 필요할 경우 직접 구현해야 합니다. 직접 구현한 예시 2가지는 다음과 같습니다.

  1. Spot 인스턴스 배치 실패 이벤트를 감지하여 일반 인스턴스를 띄우는 예시 (링크)
  2. 타입별로 서비스를 두고, 한쪽 리소스가 내려가면 조정하는 예시 (링크)

하지만 당장은 이것을 구현할 수 없었기 때문에, 일단은 Spot 인스턴스를 사용하지 않도록 설정하여 문제를 해결했습니다.

참고 자료