Amazon ECS의 AWS Fargate 작업 퇴역(retirement) 준비하기

Amazon ECS의 AWS Fargate 작업 퇴역(retirement) 준비하기

Fargate 작업 퇴역(retirement)에 대비하려면 몇 가지 작업을 수행해야 해요. 작업 퇴역 대기 기간을 설정하거나 Amazon EC2 이벤트 창을 사용하고, 퇴역 알림을 캡처해 팀에 알리는 것이 핵심이에요.

출처: 문서

본문

작업 퇴역에 대비하려면 다음 작업을 수행하세요.

  1. 작업 퇴역 대기 기간을 설정하거나 Amazon EC2 이벤트 창을 사용합니다.
  2. 작업 퇴역 알림을 캡처하여 팀 구성원에게 알립니다.
  3. force-deployment 옵션으로 서비스를 업데이트하여 모든 서비스 작업이 최신 플랫폼 개정판에서 실행되도록 할 수 있습니다. 이 단계는 선택 사항입니다.

1단계: 작업 대기 시간 설정 또는 Amazon EC2 이벤트 창 사용

Fargate가 작업 퇴역을 시작하는 시간을 구성하기 위한 두 가지 계정 설정 옵션이 있습니다: fargateTaskRetirementWaitPeriod와 fargateEventWindows입니다.

fargateTaskRetirementWaitPeriod 계정 설정 사용

Fargate가 작업 퇴역을 시작하는 시간을 구성할 수 있습니다. 기본 대기 기간은 7일입니다. 업데이트를 즉시 적용해야 하는 워크로드라면 즉시 설정(0)을 선택하세요. 더 많은 시간이 필요하면 7일 또는 14일 옵션을 구성하세요.

새로운 플랫폼 버전 개정판을 더 빨리 받으려면 더 짧은 대기 기간을 선택할 것을 권장합니다.

루트 사용자 또는 관리 사용자로 put-account-setting-default 또는 put-account-setting을 실행해 대기 기간을 구성하세요. 이름에 fargateTaskRetirementWaitPeriod 옵션을 사용하고 값 옵션을 다음 중 하나로 설정하세요.

  • 0 – AWS가 알림을 보내고 즉시 영향을 받는 작업을 퇴역시키기 시작합니다.
  • 7 – AWS가 알림을 보내고 영향을 받는 작업을 퇴역시키기 시작하기 전에 7일을 기다립니다. 이 값이 기본값입니다.
  • 14 – AWS가 알림을 보내고 영향을 받는 작업을 퇴역시키기 시작하기 전에 14일을 기다립니다.

자세한 내용은 Amazon Elastic Container Service API Reference의 put-account-setting-default와 put-account-setting을 참고하세요.

fargateEventWindows 계정 설정 사용

2025년 12월 18일부터 Amazon ECS는 Fargate 작업에 Amazon EC2 이벤트 창을 구성할 수 있게 해줍니다. 작업 퇴역의 정확한 시점을 세밀하게 제어해야 한다면(예: 업무 시간 중 중단을 피하기 위해 주말로 예약), 작업, 서비스, 클러스터에 Amazon EC2 이벤트 창을 구성할 수 있습니다.

이벤트 창을 사용하면 사용자 시작 작업이나 기본 하드웨어 성능 저하 같은 중요한 상태 이벤트로 중지되지 않는 한, Fargate는 작업이 다음 사용 가능한 창에서 퇴역되기 전에 최소 3일 동안 실행되도록 보장합니다.

fargateEventWindows 계정 설정을 enabled로 설정하세요. 루트 사용자 또는 관리 사용자로 put-account-setting-default 또는 put-account-setting API 중 하나를 사용할 수 있습니다.

각 Amazon EC2 이벤트 창은 주당 최소 4시간은 열려 있어야 하고, 각 시간 범위는 최소 2시간 이상이어야 합니다. 대규모 클러스터와 서비스에는 긴 기간(8시간 이상) 또는 최소 3일마다 한 번씩 발생하는 더 빈번한 시간 범위로 이벤트 창을 구성할 것을 권장합니다.

중요: 이벤트 창 내에서의 작업 교체는 최선 노력(best effort)입니다. 이벤트 창 밖에서 작업이 퇴역되는 것을 발견하면 기간을 늘리거나(8시간 이상) 빈도를 높이는(최소 3일마다) 것을 고려하세요.

Fargate 작업 퇴역에 Amazon EC2 이벤트 창을 적용하려면:

  1. fargateEventWindows 계정 설정을 enabled로 설정하세요. 루트 사용자 또는 관리 사용자로 put-account-setting-default 또는 put-account-setting API 중 하나를 사용할 수 있습니다. 이는 Fargate 작업에 Amazon EC2 이벤트 창 기능을 사용하기 위한 일회성 활성화입니다.
  2. AWS 콘솔 또는 AWS CLI를 통해 Amazon EC2 이벤트 창을 만드세요. CLI로 이벤트 창을 만들려면 시간 범위나 cron 표현식과 함께 EC2 create-instance-event-window API를 사용하세요. 응답에서 InstanceEventWindowId를 기록해 두세요.
aws ec2 create-instance-event-window \
                    --time-range StartWeekDay=monday,StartHour=2,EndWeekDay=wednesday,EndHour=8 \
                    --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                    --name myEventWindowName

또는 EC2 이벤트 창을 만들 때 cron 표현식을 사용할 수도 있습니다.

aws ec2 create-instance-event-window \
                    --cron-expression "* 21-23 * * 2,3" \
                    --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                    --name myEventWindowName
  1. 그런 다음 EC2 associate-instance-event-window API를 사용해 이벤트 창을 특정 서비스, 클러스터 또는 계정의 모든 작업과 연결할 수 있습니다.

ECS 서비스 작업의 경우:

aws ec2 associate-instance-event-window \
--instance-event-window-id iew-0abcdef1234567890 \
--association-target "InstanceTags=[{Key=aws:ecs:serviceArn,Value=your-service-arn}]"

ECS 클러스터의 경우:

aws ec2 associate-instance-event-window \
--instance-event-window-id iew-0abcdef1234567890 \
--association-target "InstanceTags=[{Key=aws:ecs:clusterArn,Value=your-cluster-arn}]"

계정의 모든 작업에 이벤트 창을 연결하려면:

aws ec2 associate-instance-event-window \
--instance-event-window-id iew-0abcdef1234567890 \
--association-target "InstanceTags=[{Key=aws:ecs:fargateTask,Value=true}]"

하나 이상의 키-값 쌍을 사용해 여러 서비스나 클러스터에 이벤트 창을 연결할 수 있습니다.

Fargate는 각 작업에 대해 다음 순서로 이벤트 창을 선택합니다.

  • 작업의 서비스와 연결된 이벤트 창이 있으면 그것을 사용합니다. 이는 독립형(standalone) 또는 관리되지 않는 작업에는 적용되지 않습니다.
  • 작업의 클러스터와 연결된 이벤트 창이 있으면 그것을 사용합니다.
  • 모든 Fargate 작업에 대해 설정된 이벤트 창이 있으면 그것을 사용합니다.
  • 이벤트 창 중 어떤 것도 작업과 일치하지 않으면 fargateTaskRetirementWaitPeriod 설정이 사용됩니다.

Fargate 작업 유지 관리를 위한 이벤트 창 구성

가용성 요구 사항이 다른 여러 ECS 서비스를 Fargate에서 실행하는 경우를 생각해 보세요. 작업 퇴역을 정밀하게 제어하고 싶습니다. 다음과 같이 여러 이벤트 창을 구성할 수 있습니다.

  • 모든 Fargate 작업의 기본 유지 관리: 비수기 시간(매일 오전 12시~4시)에 일상 유지 관리를 위한 이벤트 창을 만들고 aws:ecs:fargateTask 태그를 사용해 모든 Fargate 작업과 연결하세요.
  • 개발 클러스터의 주말 전용 유지 관리: 주말에 중단을 용인할 수 있는 서비스가 있는 개발 클러스터의 경우 24시간 주말 창(토요일과 일요일, 하루 종일)을 만들고 클러스터 ARN과 함께 aws:ecs:clusterArn 태그를 사용해 클러스터와 연결하세요.
  • 미션 크리티컬 서비스의 제한된 창: 주중에 높은 가동 시간이 필요한 미션 크리티컬 결제 처리 서비스의 경우 주말 이른 아침 시간(토요일과 일요일, 오전 12시~4시)으로 유지 관리를 제한하고 서비스 ARN과 함께 aws:ecs:serviceArn 태그를 사용해 특정 서비스와 연결하세요.

이 구성으로 결제 서비스는 특정 주말 전용 창을 사용하고, 개발 클러스터 서비스와 작업은 주말 24시간 창을 사용하며, 다른 모든 Fargate 작업은 기본 일일 유지 관리 창을 사용합니다.

자세한 내용은 Amazon Elastic Container Service API Reference의 put-account-setting-default와 put-account-setting을 참고하세요.

2단계: 작업 퇴역 알림을 캡처해 팀에 알리고 조치하기

작업 퇴역이 임박하면 AWS는 AWS Health Dashboard와 AWS 계정의 기본 이메일 연락처로 작업 퇴역 알림을 보냅니다. AWS Health Dashboard는 Amazon EventBridge를 포함한 다른 AWS 서비스로의 여러 통합을 제공합니다. EventBridge를 사용해 작업 퇴역 알림에서 자동화를 구축할 수 있습니다. 예를 들어 ChatOps 도구로 메시지를 전달해 임박한 퇴역의 가시성을 높일 수 있습니다. Slack 같은 채팅 애플리케이션으로 작업 퇴역 알림을 전달할 수 있습니다.

구성 개요는 다음과 같습니다.

  • Fargate는 작업 퇴역 알림을 AWS Health Dashboard로 보냅니다.
  • AWS Health Dashboard는 AWS 계정의 기본 이메일 연락처로 메일을 보내고 EventBridge에 알립니다.
  • EventBridge에는 퇴역 알림을 캡처하는 규칙이 있습니다. 이 규칙은 Event Detail Type이 "AWS Health Event"이고 Event Detail Type Code가 "AWS_ECS_TASK_PATCHING_RETIREMENT"인 이벤트를 찾습니다.
  • 규칙은 Slack Incoming Webhook을 사용해 정보를 Slack으로 전달하는 Lambda 함수를 트리거합니다. 자세한 내용은 Incoming Webhooks를 참고하세요.

코드 예시는 GitHub의 Capturing AWS Fargate Task Retirement Notifications를 참고하세요.

3단계: 작업 교체 제어하기

작업 퇴역의 정확한 시점은 제어할 수 없지만 대기 시간은 정의할 수 있습니다. 자신의 일정에 맞춰 작업 교체를 제어하려면 작업 퇴역 알림을 캡처해 먼저 작업 퇴역 날짜를 파악하세요. 그런 다음 서비스를 재배포하여 교체 작업을 시작하고, 독립형 작업도 마찬가지로 교체하세요.

롤링 배포를 사용하는 서비스의 경우 퇴역 시작 시간 전에 force-deployment 옵션으로 update-service를 사용해 서비스를 업데이트하세요. 다음 update-service 예시는 force-deployment 옵션을 사용합니다.

aws ecs update-service —-service service_name \ 
    --cluster cluster_name \
     --force-new-deployment

블루/그린 배포를 사용하는 서비스의 경우 AWS CodeDeploy에서 새 배포를 만들어야 합니다. 배포 생성 방법에 대한 정보는 AWS Command Line Interface Reference의 create-deployment를 참고하세요.

더 알아보기 (Learn more)