

# 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 - スケジューラーはタスクが RUNNING 状態に移行するかどうかを監視します。
  + 成功 - RUNNING 状態に移行したタスクが複数あるため、デプロイメントが COMPLETED 状態に移行する可能性があります。障害基準はスキップされ、サーキットブレーカーはステージ 2 に移行します。
  + 失敗 - RUNNING 状態に移行しなかったタスクが連続して発生し、デプロイが FAILED 状態に移行する可能性があります。
+ ステージ 2 - RUNNING 状態のタスクが 1 つ以上あると、デプロイメントはこの段階に入ります。サーキットブレーカーは、評価対象の現在のデプロイのタスクのヘルスチェックをチェックします。検証済みのヘルスチェックは、Elastic Load Balancing、AWS Cloud Map サービスヘルスチェック、コンテナヘルスチェックです。
  + 成功 - ヘルスチェックに合格した実行状態のタスクが少なくとも 1 つあります。
  + 失敗 - ヘルスチェックに失敗したために置き換えられたタスクが失敗のしきい値に達しました。

サービスでデプロイサーキットブレーカーメソッドを使用する際には、以下を考慮してください。EventBridge がルールを生成します。
+ この `DescribeServices` レスポンスは、デプロイの状態、`rolloutState` および `rolloutStateReason` についての洞察を提供します。新しいデプロイが開始されると、ロールアウトの状態は `IN_PROGRESS` 状態から始まります。サービスが定常状態になると、ロールアウトの状態は `COMPLETED` に移行します。サービスが定常状態にならず、サーキットブレーカーがオンになっている場合、デプロイは `FAILED` 状態に移行します。`FAILED` 状態のデプロイでは、新しいタスクは起動されません。
+ 開始および完了したデプロイに対して送信されるサービスデプロイの状態変更イベントに加えて、Amazon ECS はサーキットブレーカーがオンになったデプロイが失敗した場合にもイベントを送信します。これらのイベントは、デプロイが失敗した理由やロールバックのためにデプロイが開始されたかどうかについての詳細情報を提供します。詳細については、「[Amazon ECS サービスデプロイ状態変更イベント](ecs_service_deployment_events.md)」を参照してください。
+ 以前のデプロイが失敗し、ロールバックが発生したために新しいデプロイが開始された場合、サービスデプロイ状態変更イベントの `reason` フィールドには、ロールバックのためにデプロイが開始されたことが示されます。
+ デプロイサーキットブレーカーは、ローリング更新 (`ECS`) デプロイコントローラーを使用する Amazon ECS サービスでのみサポートされています。
+ Amazon ECS コンソールを使用するか、CloudWatch オプションと共にデプロイサーキットブレーカーを使用する場合は AWS CLI を使用する必要があります。詳細については、「*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}"
```

例:

デプロイ 1 は `COMPLETED` 状態にあります。

デプロイ 2 は起動できないため、サーキットブレーカーはデプロイ 1 にロールバックされます。デプロイ 1 は `IN_PROGRESS` 状態に移行します。

デプロイ 3 が開始され、`COMPLETED` 状態のデプロイがないため、デプロイ 3 はロールバックやタスクの起動ができません。

## 失敗しきい値
<a name="failure-threshold"></a>

デプロイサーキットブレーカはしきい値を計算し、その値を使用してデプロイを `FAILED` 状態に移行するタイミングを判断します。

デプロイサーキットブレーカの最小しきい値は 3 であり、最大しきい値は 200 です。値を次の式に使用してデプロイの失敗を判断します。

```
Minimum threshold <= 0.5 * desired task count => maximum threshold
```

計算結果が最低値の 3 より大きく、最大値の 200 より小さい場合、障害のしきい値は計算されたしきい値 (切り上げ) に設定されます。

**注記**  
しきい値のどちらも変更できません。

デプロイステータスチェックには 2 つの段階があります。

1. デプロイサーキットブレーカは、デプロイの一部であるタスクを監視して `RUNNING` 状態のタスクを確認します。スケジューラは、現在のデプロイのタスクが `RUNNING` 状態のときに失敗条件を無視して次のステージに進みます。タスク `RUNNING` 状態に到達できなかった場合、デプロイサーキットブレーカは故障数を 1 つ増やします。障害カウントがしきい値に等しい場合、デプロイは `FAILED` としてマークされます。

1. `RUNNING` 状態のタスクが 1 つ以上ある場合、このステージが開始されます。デプロイサーキットブレーカは、現在のデプロイのタスクの次のリソースにヘルスチェックを実行します。
   + Elastic Load Balancing ロードバランサー
   + AWS Cloud Map サービス
   + Amazon ECS コンテナヘルスチェック

   タスクのヘルスチェックが失敗した場合、デプロイサーキットブレーカーは障害数を 1 つ増やします。障害カウントがしきい値に等しい場合、デプロイは `FAILED` としてマークされます。

例をいくつか、次のテーブルに示します。


| 希望タスク数 | 計算 | Threshold | 
| --- | --- | --- | 
|  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 (計算値は最大値を超えています) | 

たとえば、しきい値が 3 の場合、サーキットブレーカーは故障回数が 0 に設定された状態で起動します。タスクが `RUNNING` 状態に到達できなかった場合、デプロイサーキットブレーカは故障数を 1 つ増やします。障害カウントが 3 である場合、デプロイは `FAILED` としてマークされます。

ロールバックオプションの使用方法に関するその他の例については、「[Amazon ECS デプロイサーキットブレーカーのお知らせ](https://aws.amazon.com/blogs/containers/announcing-amazon-ecs-deployment-circuit-breaker/)」を参照してください。