AWS Fargate Spot 태스크에서 스팟 종료 알림을 처리하려면 어떻게 해야 합니까?

4분 분량
0

AWS Fargate Spot 태스크에서 스팟 종료 알림을 처리하는 방법을 알고 싶습니다.

간략한 설명

Fargate Spot을 사용하여 중단 허용 Amazon Elastic Container Service(Amazon ECS) 태스크를 실행할 수 있습니다. 종료 알림은 Fargate Spot 태스크가 종료되기 전에 표시되는 2분 경고입니다. 이 경고는 애플리케이션이 정상 종료를 준비할 시간을 제공하여 스팟 중단을 관리하는 데 도움이 됩니다. 종료 알림은 Fargate Spot 태스크가 종료로 표시되는 즉시 생성됩니다. 알림은 실행 중인 Fargate Spot 태스크가 종료되는 시간을 나타냅니다. 경고는 Amazon EventBridge에 태스크 상태 변경 이벤트로 전송되고 실행 중인 태스크에 SIGTERM 신호로 전송됩니다.

태스크가 중지되기 전에 Fargate Spot의 컨테이너가 종료되도록 하려면 태스크에서 사용하는 컨테이너 정의에서 stopTimeout 값을 120초 이하로 지정합니다. stopTimeout 값을 지정하면 컨테이너가 정상적으로 종료될 시간이 주어집니다. 이 기간이 경과하면 컨테이너가 강제로 정지됩니다.

참고: stopTimeout에 대해 최댓값 120초를 지정할 수 있습니다. 이 파라미터에 값을 지정하지 않으면 기본값인 30초가 사용됩니다.

Fargate Spot을 사용하여 Amazon ECS 서비스에서 중단 신호가 수신되면 서비스 스케줄러가 추가 용량을 사용할 수 있는지 확인합니다. 서비스 스케줄러는 minimumHealthyPercentmaximumPercent 값을 사용하여 이 결정을 내립니다. 사용 가능한 용량이 있으면 서비스 스케줄러가 Fargate Spot에서 추가 태스크를 시작하려고 시도합니다. 그러나 서비스 스케줄러가 새 태스크의 용량을 찾지 못하면 stopTimeout 기간이 경과한 후 이전 태스크가 종료됩니다.

로드 밸런서와 함께 Fargate Spot을 사용할 때는 다음 사항을 고려합니다.

  • FARGATE_SPOT으로 실행되는 태스크는 태스크가 STOPPED 상태로 전환될 때까지 로드 밸런서의 대상 그룹에서 등록 취소되지 않을 수 있습니다.
  • FARGATE_SPOT을 사용하면 태스크가 종료되기 전에 대상 그룹의 등록을 취소하는 데 2분 밖에 걸리지 않습니다. 즉, FARGATE_SPOT과 연결된 모든 대상 그룹에 대한 등록 취소 지연을 2분 미만의 값으로 설정해야 합니다.

해결 방법

용량을 사용할 수 없거나 Fargate Spot의 용량이 회수되는 경우 ECS 서비스 스케줄러가 새 작업을 시작할 수 없습니다. 대신 스케줄러는 2분 전에 알림을 보낸 후 기존 작업을 종료합니다. 하지만 이러한 이벤트는 Amazon ECS 콘솔에 보고되지 않습니다.

ECS의 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 따라서 선택한 이벤트를 나타내는 간단한 규칙을 작성하고 이벤트가 규칙과 일치할 때 자동으로 조치를 취하는 것이 좋습니다. 이 문서에서는 다음 사용 사례에 대한 EventBridge 규칙을 다룹니다.

  • Fargate Spot 중단으로 인해 FARGATE_SPOT 태스크가 종료되었습니다.
  • Fargate Spot 용량을 사용할 수 없기 때문에 FARGATE_SPOT 태스크를 배치할 수 없습니다.

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

다음은 Fargate Spot 중단에 대해 중지된 이유 및 중지 코드를 표시하는 태스크 상태 변경 이벤트의 일부입니다.

{
  "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",
    ...
  }
}

stopCode는 Fargate Spot 중단으로 인해 태스크가 중지된 경우 SpotInterruption로 언급됩니다. FARGATE_SPOT 작업이 SpotInterruption에 의해 중지될 때마다 Amazon Simple Notification Service(Amazon SNS) 알림을 보내는 EventBridge 규칙을 생성할 수 있습니다.

다음을 수행합니다.

1.    Amazon SNS 주제를 생성합니다.

2.    이 사용 사례에 대한 EventBridge 규칙을 생성합니다.

이 사용 사례에 대한 EventBridge 규칙을 생성하려면 다음을 수행합니다.

1.    Amazon EventBridge 콘솔을 엽니다.

2.    탐색 창에서 [Rules(규칙)]를 선택합니다.

3.    **규칙 생성(Create rule)**을 선택합니다.

4.    규칙의 이름과 설명을 입력합니다.

5.    이벤트 버스에서 [AWS 기본 이벤트 버스]를 선택합니다.

6.    규칙 유형에에서 [이벤트 패턴이 있는 규칙]을 선택합니다.

7.    [다음]을 선택합니다.

8.    이벤트 소스에서 [AWS 서비스]를 선택합니다.

9.    이벤트 패턴에서 [사용자 지정 패턴(JSON 편집기)]를 선택하고 다음 패턴을 추가합니다.

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "stopCode": [
      "SpotInterruption"
    ],
    "clusterArn": [
      "arn:aws:ecs:exampleregion:1111222233334444:cluster/examplecluster"
    ]
  }
}

10.    [다음]을 선택합니다.

11.    대상 유형에서 [AWS 서비스]를 선택합니다.

12.    대상 선택에서 [SNS 주제]를 선택합니다.

13.    주제에서 사용자가 생성한 SNS 주제를 선택합니다.

14.    [다음]을 선택합니다.

15.    태그 구성 - 옵션 페이지에서 [다음]을 선택합니다.

16.    옵션을 검토하고 [규칙 생성]을 선택합니다.

사용할 수 없는 Fargate Spot 용량으로 인해 FARGATE_SPOT 태스크를 배치할 수 없는 경우

다음은 이 조건에서 발생한 서비스 태스크 배치 실패 이벤트의 일부입니다.

  • 태스크에서 FARGATE_SPOT 용량 공급자를 사용하려고 했습니다.
  • 서비스 스케줄러가 Fargate Spot 용량을 확보할 수 없었습니다.
{
  "version": "0",
  "id": "403b98b2-616e-4ec7-8dff-b2cba8d5bf64",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "time": "2022-02-25T14:56:32.756Z",
  "region": "ap-southeast-2",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "capacityProviderArns": [
      "arn:aws:ecs:ap-southeast-2:1111222233334444:capacity-provider/FARGATE_SPOT"
    ],
    "reason": "RESOURCE:FARGATE",
    "createdAt": "2022-02-25T14:21:04.163Z"
  }
}

사용할 수 없는 Fargate Spot 용량으로 인해 태스크를 배치할 수 없는 경우 eventName은 SERVICE_TASK_PLACEMENT_FAILURE로 언급됩니다. 즉, FARGATE_SPOT 태스크를 배치할 수 없을 때마다 SNS 알림을 보내는 EventBridge 규칙을 생성할 수 있습니다.

다음을 수행합니다.

1.    SNS 주제를 생성합니다.

2.    이 사용 사례에 대한 Amazon EventBridge 규칙을 생성합니다. 이렇게 하려면 다음 변경 사항을 제외하고 Fargate Spot 중단으로 인해 FARGATE_SPOT 태스크가 종료됨 섹션에 제공된 지침을 사용합니다.

이벤트 패턴에서 사용자 지정 패턴**(JSON 편집기)**을 선택하고 다음 패턴을 추가합니다.

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Deployment State Change"
  ],
  "detail": {
    "eventName": [
      "SERVICE_TASK_PLACEMENT_FAILURE"
    ],
    "clusterArn": [
      "arn:aws:ecs:example-region:1111222233334444:cluster/example-cluster"
    ],
    "reason": [
      "RESOURCE:FARGATE"
    ]
  }
}

관련 정보

Fargate Spot 종료 알림 처리

이벤트에 반응하는 Amazon EventBridge 규칙 생성

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음