

# Amazon ECS 배포 회로 차단기가 장애를 감지하는 방법
<a name="deployment-circuit-breaker"></a>

배포 회로 차단기는 작업이 안정 상태에 도달하는지 확인하는 롤링 업데이트 메커니즘입니다. 배포 회로 차단기에는 실패한 배포를 `COMPLETED` 상태의 배포로 자동 롤백하는 옵션이 있습니다. 회로 차단기가 실패를 계산하는 방법과 회로 차단기가 트리거되는 임계값을 사용자 지정하여 롤백 동작을 애플리케이션의 시작 특성 및 작업 실패에 대한 허용 오차와 일치하도록 할 수 있습니다.

서비스 배포의 상태가 변경되면 Amazon ECS는 서비스 배포 상태 변경 이벤트를 EventBridge로 전송합니다. 이를 통해 서비스 배포 상태를 프로그래밍 방식으로 모니터링할 수 있습니다. 자세한 내용은 [Amazon ECS 서비스 배포 상태 변경 이벤트](ecs_service_deployment_events.md) 섹션을 참조하세요. 수동 조치를 통해 배포를 시작할 수 있도록 `eventName`이 `SERVICE_DEPLOYMENT_FAILED`인 EventBridge 규칙을 생성하고 모니터링하는 것이 좋습니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)를 참조하세요.

배포 회로 차단기는 배포가 실패한 것으로 확인하면 `COMPLETED` 상태의 최신 배포를 찾습니다. 그리고 이 배포를 롤백 배포로 사용합니다. 롤백이 시작되면 배포가 `COMPLETED`에서 `IN_PROGRESS`로 변경됩니다. 즉, 배포가 `COMPLETED` 상태에 도달하기까지 다른 롤백을 사용할 수 없습니다. 배포 회로 차단기가 `COMPLETED` 상태의 배포를 찾지 못하면 회로 차단기는 새 작업을 시작하지 않으며 배포가 중단됩니다.

서비스를 생성하면 스케줄러는 시작하지 못한 작업을 2단계로 추적합니다.
+ 1단계 - 스케줄러는 작업을 모니터링하여 작업이 실행 중 상태로 전환되는지 확인합니다.
  + 성공 - 실행 중 상태로 전환된 작업이 두 개 이상 있기 때문에 배포가 완료됨 상태로 전환될 가능성이 있습니다. 실패 기준을 건너뛰고 회로 차단기는 2단계로 진행합니다.
  + 실패 - 기본적으로 실행 중 상태로 전환되지 않는 연속 작업은 실패 임계값(`resetOnHealthyTask`은 `true`)에 포함됩니다. `resetOnHealthyTask`이 `false`일 때 정상 작업이 실패 사이에 시작되는지 여부에 관계없이 모든 작업 실패가 누적됩니다.
+ 2단계 - 실행 중 상태인 작업이 하나 이상 있을 때 배포가 이 단계로 설정됩니다. 회로 차단기는 평가 중인 현재 배포의 작업에 대해 상태 확인을 확인합니다. 검증된 상태 확인은 Elastic Load Balancing, AWS Cloud Map 서비스 상태 확인, 컨테이너 상태 확인입니다.
  + 성공 - 실행 중인 작업 중 상태 확인에 통과된 작업이 하나 이상 있습니다.
  + 실패 - 상태 확인 실패로 인해 교체된 작업이 실패 임계값에 도달했습니다.

서비스에 배포 회로 차단기를 사용할 때 다음 사항을 고려해야 합니다. EventBridge에서 규칙을 생성합니다.
+ `DescribeServices` 응답은 배포 상태인 `rolloutState` 및 `rolloutStateReason`에 대한 인사이트를 제공합니다. 새 배포가 시작되면 롤아웃 상태는 `IN_PROGRESS` 상태에서 시작됩니다. 서비스가 정상 상태에 도달하면 롤아웃 상태가 `COMPLETED`로 전환됩니다. 서비스가 안정 상태에 도달하지 못하고 회로 차단기가 켜지면 배포가 `FAILED` 상태로 전환됩니다. `FAILED` 상태의 배포는 새로운 작업을 시작하지 않습니다.
+ Amazon ECS는 시작되고 완료된 배포에 대해 서비스 배포 상태 변경 이벤트를 전송하는 것 외에도 회로 차단기가 켜진 배포가 실패할 경우 이벤트를 전송합니다. 이러한 이벤트는 배포가 실패한 이유 또는 롤백으로 인해 배포가 시작된 경우에 대한 세부 정보를 제공합니다. 자세한 내용은 [Amazon ECS 서비스 배포 상태 변경 이벤트](ecs_service_deployment_events.md) 섹션을 참조하세요.
+ 이전 배포가 실패하고 롤백이 시작되었기 때문에 새 배포가 시작된 경우 서비스 배포의 `reason` 필드에 롤백으로 인해 배포가 시작되었음이 표시됩니다.
+ 배포 회로 차단기는 롤링 업데이트(`ECS`) 배포 컨트롤러를 사용하는 Amazon ECS 서비스에만 지원됩니다.
+ Amazon ECS 콘솔 또는 AWS CLI(CloudWatch 옵션과 함께 배포 회로 차단기를 사용할 때)를 사용해야 합니다. 자세한 내용은 *AWS Command Line Interface 참조*에서 [정의된 파라미터를 사용하여 서비스 생성](create-service-console-v2.md#create-custom-service) 및 [create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)를 참조하세요.

다음 `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은 롤백하거나 작업을 시작할 수 없습니다.

## 실패 임계값
<a name="failure-threshold"></a>

배포 회로 차단기는 실패 임계값을 사용하여 배포를 `FAILED` 상태로 이동할 시기를 결정합니다. 실패 수 계산 방법과 임계값 자체를 모두 구성할 수 있습니다.

### 실패 수 계산 모드
<a name="failure-counting-mode"></a>

`resetOnHealthyTask` 설정은 회로 차단기가 배포 중 작업 실패를 계산하는 방법을 제어합니다.

`true`(기본값)  
작업이 정상 상태에 도달할 때마다 실패 수가 0으로 재설정됩니다. 연속 실패만 임계값에 포함됩니다. 이 모드는 안정화 전에 간헐적인 시작 실패가 발생할 수 있는 애플리케이션에 유용합니다.

`false`  
작업 실패는 배포 전반에 걸쳐 누적됩니다. 장애 사이에 정상 작업이 시작되더라도 장애 수는 재설정되지 않습니다. 이 모드는 어떤 패턴의 실패이든 문제가 있는 배포를 나타낼 때 더 빠르게 감지합니다.

### 임계값 구성
<a name="threshold-configuration"></a>

`thresholdConfiguration` 설정은 회로 차단기가 트리거되는 시기를 정의합니다. 여기에는 임계값 계산 방법을 결정하는 `type`과 사용할 백분율 또는 수를 지정하는 `value`가 포함됩니다.

`BOUNDED_PERCENT`(기본값)  
Amazon ECS는 원하는 최신 서비스 수 `value`를 곱하여 실패 임계값을 계산합니다. 결과는 최소 3개, 최대 200개로 고정됩니다. 기본값이 50인 기본 유형입니다.

`UNBOUNDED_PERCENT`  
Amazon ECS는 원하는 최신 서비스 수 `value`를 곱하여 실패 임계값을 계산합니다. 결과에는 최소치 또는 최대치가 없습니다. 200개의 제한이 없는 비례 임계값이 필요하고 원하는 수가 많은 서비스에 이 유형을 사용합니다.

`COUNT`  
Amazon ECS는 `value`을 실패 임계값으로 직접 사용합니다. 임계값은 원하는 서비스 수에 관계없이 고정된 상태로 유지됩니다. 예를 들어 개발 환경에서 더 빠른 롤백을 위해 더 낮은 임계값이 필요한 것처럼 허용되는 실패 수가 정확해야 하는 경우 이 유형을 사용합니다.

백분율 유형(`BOUNDED_PERCENT` 및 `UNBOUNDED_PERCENT`)의 경우, `value`의 유효한 범위는 1\~100입니다. 배포 중에 Amazon ECS는 원하는 최신 서비스 수를 계산에 지속적으로 사용합니다.

### `BOUNDED_PERCENT`이 임계값을 계산하는 방법
<a name="bounded-percent-calculation"></a>

기본 `BOUNDED_PERCENT` 임계값 유형을 사용하는 경우 배포 회로 차단기는 다음 공식을 사용하여 임계값을 계산합니다.

```
Minimum threshold (3) <= ({{value}}/100) * {{desired task count}} => Maximum threshold (200)
```

계산 결과가 3보다 작으면 임계값은 3으로 설정됩니다. 결과가 200보다 크면 임계값이 200으로 설정됩니다. 그렇지 않으면 임계값이 계산된 값(반올림)으로 설정됩니다.

다음 표에는 기본값 50을 사용하는 예제가 나와 있습니다.


| 원하는 작업 개수 | 계산 | 임계값 | 
| --- | --- | --- | 
| 1 |  <pre>3 <= 0.5 * 1 => 200</pre>  | 3(계산된 값이 최솟값보다 작음) | 
| 25 |  <pre>3 <= 0.5 * 25 => 200</pre>  | 13(값이 반올림됨) | 
| 400 |  <pre>3 <= 0.5 * 400 => 200</pre>  | 200(계산된 값이 최댓값보다 큼) | 
| 800 |  <pre>3 <= 0.5 * 800 => 200</pre>  | 200(계산된 값이 최댓값보다 큼) | 

`UNBOUNDED_PERCENT`에서는 동일한 계산이 적용되지만 최소 및 최대 범위는 적용되지 않습니다. 예를 들어 원하는 개수가 800이고 값이 50인 서비스의 임계값은 400입니다.

배포 상태 검사에는 두 단계가 있습니다.

1. 배포 회로 차단기는 배포의 일부인 태스크를 모니터링하고 `RUNNING` 상태의 태스크를 확인합니다. 스케줄러는 현재 배포된 태스크가 `RUNNING` 상태일 때 실패 기준을 무시하고 다음 단계로 진행합니다. 작업이 `RUNNING` 상태에 도달하지 못하면 배포 회로 차단기가 실패 횟수를 하나씩 늘립니다. 실패 횟수가 임계값과 같으면 배포가 `FAILED`로 표시됩니다.

1. `RUNNING` 상태의 작업이 하나 이상 있을 때 이 단계가 시작됩니다. 배포 회로 차단기는 현재 배포의 태스크에 대해 다음 리소스를 대상으로 상태 확인을 수행합니다.
   + Elastic Load Balancing 로드 밸런서
   + AWS Cloud Map 서비스
   + Amazon ECS 컨테이너 상태 확인

   태스크에 대한 상태 확인이 실패하면 배포 회로 차단기가 실패 횟수를 하나씩 늘립니다. 실패 횟수가 임계값과 같으면 배포가 `FAILED`로 표시됩니다.

예를 들어, 임계값이 3인 경우 회로 차단기는 실패 횟수가 0으로 설정된 상태에서 시작됩니다. 작업이 `RUNNING` 상태에 도달하지 못하면 배포 회로 차단기가 실패 횟수를 하나씩 늘립니다. 실패 횟수가 3과 같아지면 배포가 `FAILED`로 표시됩니다.

롤백 옵션을 사용하는 방법에 대한 추가 예제는 [Amazon ECS 배포 회로 차단기 발표](https://aws.amazon.com/blogs/containers/announcing-amazon-ecs-deployment-circuit-breaker/)를 참조하세요.