Amazon ECS 태스크 스케일인 보호 엔드포인트

Amazon ECS 태스크 스케일인 보호 엔드포인트

Amazon ECS container agent가 제공하는 태스크 스케일인 보호(task scale-in protection) 엔드포인트를 사용해 태스크가 스케일인 이벤트로부터 보호되도록 설정하는 방법을 알아봐요.

출처: 문서

본문

Amazon ECS container agent는 Amazon ECS 태스크의 컨테이너에 ECS_AGENT_URI 환경 변수를 자동으로 주입해 container agent API 엔드포인트와 상호 작용하는 방법을 제공해요.

보호의 필요성을 스스로 판단할 수 있는 태스크에는 Amazon ECS container agent 엔드포인트를 사용할 것을 권장해요. 컨테이너가 작업 처리를 시작할 때 컨테이너 내부에서 태스크 스케일인 보호 엔드포인트 경로 $ECS_AGENT_URI/task-protection/v1/state로 protectionEnabled 속성을 설정할 수 있어요. 컨테이너 내부에서 이 URI로 PUT 요청을 사용해 태스크 스케일인 보호를 설정해요. 이 URI로 GET 요청을 하면 태스크의 현재 보호 상태가 반환돼요.

태스크 스케일인 보호 요청 파라미터

다음 요청 파라미터로 ${ECS_AGENT_URI}/task-protection/v1/state 엔드포인트를 사용해 태스크 스케일인 보호를 설정할 수 있어요.

ProtectionEnabled — 태스크를 보호로 표시하려면 true를 지정하고, 보호를 제거해 태스크를 종료 대상으로 만들려면 false를 지정해요. Type: Boolean, Required: Yes.

ExpiresInMinutes — 태스크가 보호되는 분 수. 최소 1분에서 최대 2,880분(48시간)까지 지정할 수 있어요. 이 기간 동안 태스크는 서비스 Auto Scaling이나 배포의 스케일인 이벤트로 종료되지 않아요. 이 기간이 지나면 protectionEnabled 파라미터가 false로 설정돼요. 시간을 지정하지 않으면 태스크는 자동으로 120분(2시간) 동안 보호돼요. Type: Integer, Required: No.

다음 예시들은 다양한 기간으로 태스크 보호를 설정하는 방법을 보여줘요.

기본 기간으로 태스크 보호 (2시간):

curl --request PUT --header 'Content-Type: application/json' ${ECS_AGENT_URI}/task-protection/v1/state --data '{"ProtectionEnabled":true}'

60분 동안 태스크 보호:

curl --request PUT --header 'Content-Type: application/json' ${ECS_AGENT_URI}/task-protection/v1/state --data '{"ProtectionEnabled":true,"ExpiresInMinutes":60}'

24시간 동안 태스크 보호:

curl --request PUT --header 'Content-Type: application/json' ${ECS_AGENT_URI}/task-protection/v1/state --data '{"ProtectionEnabled":true,"ExpiresInMinutes":1440}'

Windows 컨테이너 예시 (Examples for Windows containers)

Windows 컨테이너의 경우 curl 대신 PowerShell의 Invoke-RestMethod cmdlet을 사용할 수 있어요. 다음 예시들은 이전 curl 명령의 PowerShell 버전을 보여줘요.

기본 기간으로 Windows 컨테이너 태스크 보호 (2시간):

Invoke-RestMethod -Uri $env:ECS_AGENT_URI/task-protection/v1/state -Method Put -Body '{"ProtectionEnabled":true}' -ContentType 'application/json'

60분 동안 Windows 컨테이너 태스크 보호:

Invoke-RestMethod -Uri $env:ECS_AGENT_URI/task-protection/v1/state -Method Put -Body '{"ProtectionEnabled":true,"ExpiresInMinutes":60}' -ContentType 'application/json'

24시간 동안 Windows 컨테이너 태스크 보호:

Invoke-RestMethod -Uri $env:ECS_AGENT_URI/task-protection/v1/state -Method Put -Body '{"ProtectionEnabled":true,"ExpiresInMinutes":1440}' -ContentType 'application/json'

PUT 요청은 다음 응답을 반환해요.

{
  "protection": {
    "ExpirationDate": "2023-12-20T21:57:44.837Z",
    "ProtectionEnabled": true,
    "TaskArn": "arn:aws:ecs:us-west-2:111122223333:task/1234567890abcdef0"
  }
}

태스크 스케일인 보호 응답 파라미터

태스크 스케일인 보호 엔드포인트 ${ECS_AGENT_URI}/task-protection/v1/state에서 JSON 응답으로 다음 정보가 반환돼요.

ExpirationDate — 태스크에 대한 보호가 만료되는 epoch 시간. 태스크가 보호되지 않으면 이 값은 null이에요.

ProtectionEnabled — 태스크의 보호 상태. 태스크에 스케일인 보호가 활성화되어 있으면 값은 true, 그렇지 않으면 false예요.

TaskArn — 컨테이너가 속한 태스크의 전체 ARN(Amazon Resource Name).

보호된 태스크에 대해 반환되는 세부 정보의 예시:

curl --request GET ${ECS_AGENT_URI}/task-protection/v1/state

Windows 컨테이너의 경우 다음 PowerShell 명령으로 보호 상태를 얻습니다:

Invoke-RestMethod -Uri $env:ECS_AGENT_URI/task-protection/v1/state -Method Get
{
    "protection":{
        "ExpirationDate":"2023-12-20T21:57:44Z",
        "ProtectionEnabled":true,
        "TaskArn":"arn:aws:ecs:us-west-2:111122223333:task/1234567890abcdef0"
    }
}

실패 시 반환되는 정보

  • Arn — 태스크의 전체 ARN.
  • Detail — 실패와 관련된 세부 정보.
  • Reason — 실패 이유.

보호되지 않는 태스크에 대해 반환되는 세부 정보 예시:

{
    "failure":{
        "Arn":"arn:aws:ecs:us-west-2:111122223333:task/1234567890abcdef0",
        "Detail":null,
        "Reason":"TASK_NOT_VALID"
    }
}

예외 발생 시 반환되는 정보

  • requestID — 예외를 발생시킨 Amazon ECS API 호출에 대한 AWS 요청 ID.
  • Arn — 태스크 또는 서비스의 전체 ARN.
  • Code — 오류 코드.
  • Message — 오류 메시지.

참고 — RequestError 또는 RequestTimeout 오류가 나타나면 네트워킹 문제일 가능성이 높아요. Amazon ECS용 VPC 엔드포인트를 사용해 보세요.

오류 발생 시 반환되는 세부 정보 예시:

{
    "requestID":"12345-abc-6789-0123-abc",
    "error":{
        "Arn":"arn:aws:ecs:us-west-2:555555555555:task/my-cluster-name/1234567890abcdef0",
        "Code":"AccessDeniedException",
        "Message":"User: arn:aws:sts::444455556666:assumed-role/my-ecs-task-role/1234567890abcdef0 is not authorized to perform: ecs:GetTaskProtection on resource: arn:aws:ecs:us-west-2:555555555555:task/test/1234567890abcdef0 because no identity-based policy allows the ecs:GetTaskProtection action"
    }    
}

네트워크 문제나 Amazon ECS 컨트롤 플레인이 중단된 이유 등으로 Amazon ECS agent가 Amazon ECS 엔드포인트에서 응답을 얻지 못하면 다음 오류가 나타나요.

{
  "error": {
    "Arn": "arn:aws:ecs:us-west-2:555555555555:task/my-cluster-name/1234567890abcdef0",
    "Code": "RequestCanceled",
    "Message": "Timed out calling Amazon ECS Task Protection API"
  }
}

Amazon ECS agent가 Amazon ECS에서 제한(throttling) 예외를 받으면 다음 오류가 나타나요.

{
  "requestID": "12345-abc-6789-0123-abc",
  "error": {
    "Arn": "arn:aws:ecs:us-west-2:555555555555:task/my-cluster-name/1234567890abcdef0",
    "Code": "ThrottlingException",
    "Message": "Rate exceeded"
  }
}

더 알아보기 (Learn more)