Amazon ECS デプロイサーキットブレーカーが障害を検出する方法
デプロイサーキットブレーカーは、タスクが定常状態に到達したかどうかを判断する、ローリング更新メカニズムです。デプロイサーキットブレーカーには、デプロイが失敗した場合に、 COMPLETED 状態のデプロイに自動的にロールバックするオプションがあります。回路ブレーカーが障害をカウントする方法と、トリガーとなるしきい値をカスタマイズできるため、ロールバック動作をアプリケーションのスタートアップ特性とタスク障害に対する許容度に合わせることができます。
サービスデプロイの状態が変わったとき、Amazon ECS はサービスデプロイ状態変更イベントを EventBridge に送信します。これにより、サービスデプロイの状態を監視するためのプログラムによる方法がもたらされます。詳細については、「Amazon ECS サービスデプロイ状態変更イベント」を参照してください。デプロイを開始するための手動アクションを実行できるように、eventName が SERVICE_DEPLOYMENT_FAILED の EventBridge ルールをを使用して作成および監視することをお勧めします。詳細については、「Amazon EventBridge ユーザーガイド」の「EventBridge の開始方法」を参照してください。
デプロイサーキットブレーカーは、デプロイが失敗したと判断すると、COMPLETED 状態にある最新のデプロイを探します。このデプロイをロールバックデプロイとして使用します。ロールバックが開始されると、デプロイは COMPLETED から IN_PROGRESS に変わります。つまり、デプロイは COMPLETED 状態になるまで次のロールバックの対象にはなりません。デプロイサーキットブレーカーが COMPLETED 状態のデプロイを見つけられない場合、サーキットブレーカーは新しいタスクを起動せず、デプロイは停止します。
サービスを作成すると、スケジューラーは起動に失敗したタスクを 2 段階で追跡します。
-
ステージ 1 - スケジューラーはタスクが RUNNING 状態に移行するかどうかを監視します。
-
成功 - RUNNING 状態に移行したタスクが複数あるため、デプロイメントが COMPLETED 状態に移行する可能性があります。障害基準はスキップされ、サーキットブレーカーはステージ 2 に移行します。
-
失敗 - デフォルトでは、RUNNING 状態に移行しない連続タスクは失敗しきい値 (
resetOnHealthyTaskはtrue) にカウントされます。resetOnHealthyTaskがfalseの場合、正常なタスクが失敗の間に開始されるかどうかに関係なく、すべてのタスクの失敗が累積されます。
-
-
ステージ 2 - RUNNING 状態のタスクが 1 つ以上あると、デプロイメントはこの段階に入ります。サーキットブレーカーは、評価対象の現在のデプロイのタスクのヘルスチェックをチェックします。検証済みのヘルスチェックは、Elastic Load Balancing、AWS Cloud Map サービスヘルスチェック、コンテナヘルスチェックです。
-
成功 - ヘルスチェックに合格した実行状態のタスクが少なくとも 1 つあります。
-
失敗 - ヘルスチェックに失敗したために置き換えられたタスクが失敗のしきい値に達しました。
-
サービスでデプロイサーキットブレーカーメソッドを使用する際には、以下を考慮してください。EventBridge がルールを生成します。
-
この
DescribeServicesレスポンスは、デプロイの状態、rolloutStateおよびrolloutStateReasonについての洞察を提供します。新しいデプロイが開始されると、ロールアウトの状態はIN_PROGRESS状態から始まります。サービスが定常状態になると、ロールアウトの状態はCOMPLETEDに移行します。サービスが定常状態にならず、サーキットブレーカーがオンになっている場合、デプロイはFAILED状態に移行します。FAILED状態のデプロイでは、新しいタスクは起動されません。 -
開始および完了したデプロイに対して送信されるサービスデプロイの状態変更イベントに加えて、Amazon ECS はサーキットブレーカーがオンになったデプロイが失敗した場合にもイベントを送信します。これらのイベントは、デプロイが失敗した理由やロールバックのためにデプロイが開始されたかどうかについての詳細情報を提供します。詳細については、「Amazon ECS サービスデプロイ状態変更イベント」を参照してください。
-
以前のデプロイが失敗し、ロールバックが発生したために新しいデプロイが開始された場合、サービスデプロイ状態変更イベントの
reasonフィールドには、ロールバックのためにデプロイが開始されたことが示されます。 -
デプロイサーキットブレーカーは、ローリング更新 (
ECS) デプロイコントローラーを使用する Amazon ECS サービスでのみサポートされています。 -
Amazon ECS コンソールを使用するか、CloudWatch オプションと共にデプロイサーキットブレーカーを使用する場合は AWS CLI を使用する必要があります。詳細については、「AWS Command Line Interfaceリファレンス」の「定義済みのパラメータを使用したサービスの作成」および「create-service」を参照してください。
以下の create-service AWS CLI の例は、デプロイサーキットブレーカーと共にロールバックオプションが使用されている場合の Linux サービスの作成方法を示しています。
aws ecs create-service \ --service-nameMyService\ --deployment-controller type=ECS\ --desired-count3\ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \ --task-definitionsample-fargate:1\ --launch-typeFARGATE\ --platform-familyLINUX\ --platform-version1.4.0\ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
次の create-service AWS CLI 例は、固定障害数 5 と累積障害追跡を使用するカスタムデプロイサーキットブレーカー設定でサービスを作成する方法を示しています。
aws ecs create-service \ --service-nameMyService\ --deployment-controller type=ECS\ --desired-count10\ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true,resetOnHealthyTask=false,thresholdConfiguration={type=COUNT,value=5}}" \ --task-definitionsample-fargate:1\ --launch-typeFARGATE\ --platform-familyLINUX\ --platform-version1.4.0\ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
例:
デプロイ 1 は COMPLETED 状態にあります。
デプロイ 2 は起動できないため、サーキットブレーカーはデプロイ 1 にロールバックされます。デプロイ 1 は IN_PROGRESS 状態に移行します。
デプロイ 3 が開始され、COMPLETED 状態のデプロイがないため、デプロイ 3 はロールバックやタスクの起動ができません。
失敗しきい値
デプロイサーキットブレーカは、デプロイを FAILED 状態にいつ移行するかを決定するためのしきい値を計算します。障害のカウント方法としきい値自体の両方を設定できます。
失敗回数モード
resetOnHealthyTask の設定は、デプロイ中にサーキットブレーカーがタスクの失敗をカウントする方法を制御します。
true(デフォルト)-
失敗回数は、タスクが正常な状態に達するたびに 0 にリセットされます。連続した失敗のみがしきい値にカウントされます。このモードは、安定する前に断続的なスタートアップ障害が発生する可能性があるアプリケーションに役立ちます。
false-
タスクの失敗は、デプロイ全体で累積されます。正常なタスクが失敗の間に開始されても、失敗回数はリセットされません。このモードでは、障害パターンが問題のあるデプロイを示している場合に、より迅速に検出できます。
しきい値の設定
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 がしきい値を計算する方法
デフォルトの BOUNDED_PERCENT のしきい値タイプを使用すると、デプロイサーキットブレーカーは次の式を使用してしきい値を計算します。
Minimum threshold (3) <= (value/100) * desired task count => Maximum threshold (200)
計算の結果が最小値 3 を下回った場合、しきい値は 3 に設定されます。結果が 200 より大きい場合、しきい値は 200 に設定されます。それ以外の場合、しきい値は計算された値 (切り上げ) に設定されます。
次の表は、デフォルト値の 50 を使用した例を示しています。
| 希望タスク数 | 計算 | Threshold |
|---|---|---|
|
1 |
|
3 (計算値は最小値より小さい) |
|
25 |
|
13 (値は切り上げられます) |
|
400 |
|
200 (計算値は最大値を超えています) |
|
800 |
|
200 (計算値は最大値を超えています) |
UNBOUNDED_PERCENT では、同じ計算が適用されますが、最小値と最大値の制限はありません。例えば、目標件数が 800 で値が 50 のサービスの場合、しきい値は 400 になります。
デプロイステータスチェックには 2 つの段階があります。
-
デプロイサーキットブレーカは、デプロイの一部であるタスクを監視して
RUNNING状態のタスクを確認します。スケジューラは、現在のデプロイのタスクがRUNNING状態のときに失敗条件を無視して次のステージに進みます。タスクがRUNNING状態に到達できなかった場合、デプロイサーキットブレーカは故障数を 1 つ増やします。障害カウントがしきい値に等しい場合、デプロイはFAILEDとしてマークされます。 -
RUNNING状態のタスクが 1 つ以上ある場合、このステージが開始されます。デプロイサーキットブレーカは、現在のデプロイのタスクの次のリソースにヘルスチェックを実行します。-
Elastic Load Balancing ロードバランサー
-
AWS Cloud Map のサービス
-
Amazon ECS コンテナヘルスチェック
タスクのヘルスチェックが失敗した場合、デプロイサーキットブレーカーは障害数を 1 つ増やします。障害カウントがしきい値に等しい場合、デプロイは
FAILEDとしてマークされます。 -
たとえば、しきい値が 3 の場合、サーキットブレーカーは故障回数が 0 に設定された状態で起動します。タスクが RUNNING 状態に到達できなかった場合、デプロイサーキットブレーカは故障数を 1 つ増やします。障害カウントが 3 である場合、デプロイは FAILED としてマークされます。
ロールバックオプションの使用方法に関するその他の例については、「Amazon ECS デプロイサーキットブレーカーのお知らせ