Amazon ECS 배포 서킷 브레이커가 실패를 감지하는 방법
Amazon ECS 배포 서킷 브레이커가 실패를 감지하는 방법
배포 서킷 브레이커(deployment circuit breaker)는 태스크가 안정 상태(steady state)에 도달했는지 결정하는 롤링 업데이트 메커니즘이에요. 배포 서킷 브레이커에는 실패한 배포를 COMPLETED 상태의 배포로 자동 롤백하는 옵션이 있습니다.
출처: 문서
본문
서킷 브레이커가 실패를 어떻게 계산하고 어느 임계값에서 트리거할지 사용자 지정할 수 있어서, 롤백 동작이 애플리케이션의 시작 특성과 태스크 실패에 대한 허용도에 맞도록 조정할 수 있어요.
서비스 배포 상태가 변경되면 Amazon ECS는 EventBridge에 서비스 배포 상태 변경 이벤트를 전송합니다. 이는 서비스 배포 상태를 프로그래매틱하게 모니터링하는 방법을 제공해요. 자세한 내용은 Amazon ECS 서비스 배포 상태 변경 이벤트(Amazon ECS service deployment state change events)를 참고하세요. eventName이 SERVICE_DEPLOYMENT_FAILED인 EventBridge 규칙을 만들고 모니터링해 배포를 시작하기 위해 수동 조치를 취할 수 있도록 할 것을 권장합니다. 자세한 내용은 Amazon EventBridge 사용자 가이드의 EventBridge 시작하기(Getting started with EventBridge)를 참고하세요.
배포 서킷 브레이커가 배포가 실패했다고 결정하면 COMPLETED 상태에 있는 가장 최근 배포를 찾아요. 이것이 롤백 배포로 사용되는 배포입니다. 롤백이 시작되면 배포가 COMPLETED에서 IN_PROGRESS로 변경됩니다. 이는 배포가 COMPLETED 상태에 도달할 때까지 다른 롤백 대상이 될 수 없음을 의미해요. 배포 서킷 브레이커가 COMPLETED 상태의 배포를 찾지 못하면 새 태스크를 시작하지 않고 배포는 중단(stalled)됩니다.
서비스를 만들 때 스케줄러는 실패한 태스크를 두 단계로 추적합니다.
1단계 — 스케줄러는 태스크가 RUNNING 상태로 전환되는지 모니터링합니다.
- 성공 —
RUNNING상태로 전환된 태스크가 둘 이상 있으므로 배포가COMPLETED상태로 전환될 가능성이 있어요. 실패 기준은 건너뛰고 서킷 브레이커는 2단계로 이동합니다. - 실패 — 기본적으로
RUNNING상태로 전환되지 않는 연속 태스크가 실패 임계값에 집계됩니다(resetOnHealthyTask가true).resetOnHealthyTask가false이면 실패 사이에 정상 태스크가 시작되는지와 관계없이 모든 태스크 실패가 누적됩니다.
2단계 — 하나 이상의 태스크가 RUNNING 상태가 되면 배포가 이 단계에 진입합니다. 서킷 브레이커는 평가 중인 현재 배포의 태스크에 대한 상태 확인을 확인합니다. 검증되는 상태 확인은 Elastic Load Balancing, AWS Cloud Map 서비스 상태 확인, 컨테이너 상태 확인입니다.
- 성공 — 상태 확인이 통과된 실행 상태의 태스크가 하나 이상 있습니다.
- 실패 — 상태 확인 실패로 교체된 태스크가 실패 임계값에 도달했습니다.
서비스에 배포 서킷 브레이커 방식을 사용할 때 다음을 고려하세요. EventBridge가 규칙을 생성해요.
DescribeServices응답은 배포 상태에 대한 통찰을 제공하며,rolloutState와rolloutStateReason을 포함합니다. 새 배포가 시작되면 롤아웃 상태는IN_PROGRESS상태로 시작합니다. 서비스가 안정 상태에 도달하면 롤아웃 상태는COMPLETED로 전환됩니다. 서비스가 안정 상태에 도달하지 못하고 서킷 브레이커가 켜져 있으면 배포는FAILED상태로 전환됩니다.FAILED상태의 배포는 새 태스크를 시작하지 않습니다.- 시작했거나 완료된 배포에 대해 Amazon ECS가 보내는 서비스 배포 상태 변경 이벤트 외에도, 서킷 브레이커가 켜진 배포가 실패하면 Amazon ECS도 이벤트를 전송해요. 이러한 이벤트는 배포가 실패한 이유나 롤백 때문에 배포가 시작되었는지에 대한 세부 정보를 제공합니다.
- 이전 배포가 실패하고 롤백이 발생해 새 배포가 시작되면, 서비스 배포 상태 변경 이벤트의
reason필드는 롤백 때문에 배포가 시작되었다는 것을 나타냅니다. - 배포 서킷 브레이커는 롤링 업데이트(ECS) 배포 컨트롤러를 사용하는 Amazon ECS 서비스에서만 지원됩니다.
- CloudWatch 옵션과 함께 배포 서킷 브레이커를 사용할 때는 Amazon ECS 콘솔이나 AWS CLI를 사용해야 해요. 자세한 내용은 정의된 파라미터로 서비스 만들기(Create a service using defined parameters)와 AWS Command Line Interface Reference의 create-service를 참고하세요.
다음 create-service AWS CLI 예시는 롤백 옵션과 함께 배포 서킷 브레이커를 사용할 때 Linux 서비스를 만드는 방법을 보여줍니다.
aws ecs create-service \
--service-name MyService \
--deployment-controller type=ECS \
--desired-count 3 \
--deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \
--task-definition sample-fargate:1 \
--launch-type FARGATE \
--platform-family LINUX \
--platform-version 1.4.0 \
--network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
다음 create-service AWS CLI 예시는 고정 실패 횟수 5와 누적 실패 추적을 사용하는 사용자 지정 배포 서킷 브레이커 구성으로 서비스를 만드는 방법을 보여줍니다.
aws ecs create-service \
--service-name MyService \
--deployment-controller type=ECS \
--desired-count 10 \
--deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true,resetOnHealthyTask=false,thresholdConfiguration={type=COUNT,value=5}}" \
--task-definition sample-fargate:1 \
--launch-type FARGATE \
--platform-family LINUX \
--platform-version 1.4.0 \
--network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
예시: 배포 1이 COMPLETED 상태입니다. 배포 2가 시작될 수 없어 서킷 브레이커가 배포 1로 롤백합니다. 배포 1은 IN_PROGRESS 상태로 전환됩니다. 배포 3이 시작되고 COMPLETED 상태의 배포가 없으므로 배포 3은 롤백하거나 태스크를 시작할 수 없습니다.
실패 임계값(Failure threshold)
배포 서킷 브레이커는 실패 임계값을 사용해 배포를 FAILED 상태로 전환할 시점을 결정합니다. 실패를 계산하는 방식과 임계값 자체를 모두 구성할 수 있어요.
실패 계산 모드(Failure counting mode)
resetOnHealthyTask 설정은 배포 중 서킷 브레이커가 태스크 실패를 계산하는 방식을 제어합니다.
true(기본값) — 태스크가 정상 상태에 도달할 때마다 실패 횟수가 0으로 재설정됩니다. 연속 실패만 임계값에 집계됩니다. 이 모드는 안정화되기 전에 간헐적인 시작 실패를 겪을 수 있는 애플리케이션에 유용해요.false— 배포 전체에 걸쳐 태스크 실패가 누적됩니다. 실패 사이에 정상 태스크가 시작되어도 실패 횟수는 재설정되지 않습니다. 이 모드는 어떤 실패 패턴이든 문제가 있는 배포를 나타낼 때 더 빠르게 감지할 수 있게 해줍니다.
임계값 구성(Threshold configuration)
thresholdConfiguration 설정은 서킷 브레이커가 트리거되는 시점을 정의합니다. 임계값이 계산되는 방식을 결정하는 type과 사용할 백분율 또는 횟수를 지정하는 value를 포함합니다.
BOUNDED_PERCENT(기본값) — Amazon ECS가value에 최신 서비스 원하는 수(desired count)를 곱해 실패 임계값을 계산합니다. 결과는 최소 3, 최대 200으로 제한됩니다. 기본값 50의 기본 유형입니다.UNBOUNDED_PERCENT— Amazon ECS가value에 최신 서비스 desired count를 곱해 실패 임계값을 계산합니다. 결과에 최소·최대 제한이 없습니다. 200 상한 없이 비례적 임계값이 필요한 큰 desired count를 가진 서비스에 이 유형을 사용하세요.COUNT— Amazon ECS가value를 실패 임계값으로 직접 사용합니다. 임계값은 서비스 desired count와 관계없이 고정됩니다. 정확한 허용 실패 횟수를 원할 때 이 유형을 사용하세요. 예를 들어 개발 환경에서 더 빠른 롤백을 위해 낮은 임계값을 사용합니다.
백분율 유형(BOUNDED_PERCENT와 UNBOUNDED_PERCENT)에 대해 value의 유효 범위는 1–100입니다. 배포 중 Amazon ECS는 계산에서 최신 서비스 desired count를 지속적으로 사용합니다.
BOUNDED_PERCENT가 임계값을 계산하는 방법
기본 BOUNDED_PERCENT 임계값 유형을 사용하면 배포 서킷 브레이커는 다음 공식으로 임계값을 계산합니다:
Minimum threshold (3) <= (value/100) * desired task count => Maximum threshold (200)
계산 결과가 3보다 작으면 임계값은 3으로 설정됩니다. 결과가 200보다 크면 임계값은 200으로 설정됩니다. 그렇지 않으면 임계값이 계산된 값(올림)으로 설정됩니다.
다음 표는 기본값 50을 사용한 예시를 제공합니다:
| Desired task count | 계산 | 임계값 |
|---|---|---|
| 1 | 3 <= 0.5 * 1 => 200 |
3 (계산 값이 최소값보다 작음) |
| 25 | 3 <= 0.5 * 25 => 200 |
13 (값을 올림) |
| 400 | 3 <= 0.5 * 400 => 200 |
200 (계산 값이 최대값보다 큼) |
| 800 | 3 <= 0.5 * 800 => 200 |
200 (계산 값이 최대값보다 큼) |
UNBOUNDED_PERCENT에서는 최소·최대 제한 없이 같은 계산이 적용됩니다. 예를 들어 desired count 800과 값 50을 가진 서비스는 임계값 400을 가지게 돼요.
배포 상태 확인에는 두 단계가 있습니다.
- 배포 서킷 브레이커는 배포의 일부인 태스크를 모니터링하고
RUNNING상태의 태스크를 확인합니다. 현재 배포에서 태스크가RUNNING상태이면 스케줄러는 실패 기준을 무시하고 다음 단계로 진행합니다. 태스크가RUNNING상태에 도달하지 못하면 배포 서킷 브레이커는 실패 횟수를 1 증가시킵니다. 실패 횟수가 임계값과 같아지면 배포는FAILED로 표시됩니다. - 이 단계는 하나 이상의 태스크가
RUNNING상태일 때 진입합니다. 배포 서킷 브레이커는 현재 배포의 태스크에 대해 다음 리소스에 상태 확인을 수행합니다:- Elastic Load Balancing 로드 밸런서
- AWS Cloud Map 서비스
- Amazon ECS 컨테이너 상태 확인
태스크에 대한 상태 확인이 실패하면 배포 서킷 브레이커는 실패 횟수를 1 증가시킵니다. 실패 횟수가 임계값과 같아지면 배포는
FAILED로 표시됩니다.
예를 들어 임계값이 3이면 서킷 브레이커는 실패 횟수 0으로 시작합니다. 태스크가 RUNNING 상태에 도달하지 못하면 배포 서킷 브레이커는 실패 횟수를 1 증가시킵니다. 실패 횟수가 3과 같아지면 배포는 FAILED로 표시됩니다.
롤백 옵션 사용에 대한 추가 예시는 Announcing Amazon ECS deployment circuit breaker를 참고하세요.