[アップデート] Amazon ECS で手動ロールバック(デプロイメントの手動停止)がサポートされました

[アップデート] Amazon ECS で手動ロールバック(デプロイメントの手動停止)がサポートされました

Clock Icon2025.05.06

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

Amazon ECS で手動ロールバック(デプロイメントの手動停止)がサポートされました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/05/amazon-ecs-1-click-rollbacks-service-deployments/

アップデート内容

アップデート前までの手動ロールバックについて触れていきます。

ロールバック」と言う言葉の捉え方によっては、「ロールバックじゃない!」という方もいるかもしれませんが、安定バージョンのリビジョンを利用したデプロイメントを再作成することで、もともと手動でロールバックっぽいことができていました。

はじめに ECS サービスへのデプロイが事実上、失敗している(デプロイ自体の状態は IN_PROGRESS で、タスクが起動/停止を繰り返している)状態が発生したとします。

Untitled(162).png

タスクの起動/停止の原因がリビジョン Y の更新内容だったとします。リビジョン Y を利用したデプロイメント 2 を停止したいですよね?

しかし、アップデート前までは「リビジョン Y を利用したデプロイメント 2 を停止する」といった、直接的なデプロイメントの手動停止ができませんでした。

そのため、リビジョン X を利用した、新しいデプロイメント(デプロイメント3)を作成する必要がありました。

Untitled(161).png

デプロイメント 3 によって、以前のデプロイメントで発生した ECS タスクの削除が開始されます。デプロイメント 1 のタスクは削除されてしまいますが、以前の状態へ巻き戻すといった手動のロールバックが完了します。デプロイメント 2 で発生したタスクを起動し続ける挙動は、停止されます。

Untitled(163) (1).png

今回のアップデートは、先ほどできなかった「リビジョン Y を利用したデプロイメント 2 を停止する」ができるようになりました。といったものです。

自動ロールバックについて

先ほど「直接的なデプロイメントの手動停止ができませんでした。」と記載しました。というのも、自動ロールバックが AWS には提供されているためです。

自動ロールバックには、CloudWatch Alarm によるものと、デプロイサーキットブレーカーの 2 種類があります。

CloudWatch Alarm の自動ロールバックは、デプロイ後に HTTPCode_ELB_5XX_CountCPUUtilizationMemoryUtilization などのメトリクスを監視し、閾値を超えた場合にロールバックする機能です。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deployment-alarm-failure.html

デプロイサーキットブレーカーによる自動ロールバックは、デプロイメントによって起動する ECS タスクが、 RUNNING 状態に移行するか/ヘルスチェックに合格するかをチェックし、一定回数チェックに失敗した場合にロールバックをする機能です。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deployment-circuit-breaker.html

アップデート内容を見てみると、自動ロールバックで提供される CloudWatch Alarm およびデプロイサーキットブレーカーのいずれもで検出されなかった場合に有効である旨が記載されています。(私個人としては体験したことがないですが、頭の片隅に入れておきましょう。)

Previously, in scenarios where a failing deployment was not detected by either of these mechanisms, customers had to manually trigger a new deployment to roll back to a previous safe state.

Previously, in scenarios where a failing deployment was not detected by either of these mechanisms, customers had to manually trigger a new deployment to roll back to a previous safe state.

今回のアップデートで、私個人的に嬉しいポイントは、デプロイサーキットブレーカーが発動するより前にロールバックが可能になったことです。

デプロイサーキットブレーカーの最小タスク数

デプロイサーキットブレーカーが発動するタイミング(何タスク起動失敗したらロールバックするか)は、 ECS サービスに定義した Desired Count(希望するタスク数)に依存し、計算式は Minimum threshold <= 0.5 * desired task count => maximum threshold で求まります。

https://dev.classmethod.jp/articles/the-minimum-failure-threshold-for-deployment-circuit-breakers-has-been-changed-to-3/

ただし、最小タスク数は 3 となっており、Desired Count が 1 であっても、タスクが 3 回失敗するのを見届けないと自動ロールバックが働きません。

普段の検証などで時間がかかっていた部分が、解消されそうで嬉しいです。

手動ロールバックの動き

手動ロールバックの挙動について説明します。ECS サービスへのデプロイが事実上、失敗している(デプロイ自体の状態は IN_PROGRESS で、タスクが起動/停止を繰り返している)状態が発生したとします。

Untitled(168).png

StopServiceDeployment API によって、デプロイメント 2 のステータスは ROLLBACK_REQUESTED(ロールバックはリクエストされました)へ移行します。

Untitled(165).png

デプロイメント 2 は ROLLBACK_IN_PROGRESS(ロールバックが進行中)に遷移し、ロールバックを開始します。

Untitled(166).png

最後に ROLLBACK_SUCCESSFUL(ロールバックが成功)に遷移し完了です。この通り、デプロイメント 1 の置き換えが発生することなく、ロールバックが完了します。

Untitled(166) (1).png

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stop-service-deployment.html

やってみた

実際に手動ロールバックを試してみます。

StopServiceDeployment はマネジメントコンソール or API 経由で実行可能です。今回はマネジメントコンソール経由で実行します。

デプロイメントのステータスは成功、デプロイサーキットブレーカーはオンにしています。

2025-05-06 at 17.36.33-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

ECS タスクの Desired Count は 1 にしています。そのため先ほどの通り、デプロイメントサーキットブレーカーの最小タスク数は 3 になります。

2025-05-06 at 17.38.03-サービスタスク  Elastic Container Service  ap-northeast-1.png

サービスの更新からリビジョンを更新します。このリビジョンでは存在しない、コンテナイメージを取得するよう設定しています。

2025-05-06 at 17.39.12-サービスを更新  Elastic Container Service  ap-northeast-1.png

新しいデプロイメントが作成され、ステータスが進行中になっています。

2025-05-06 at 17.40.36-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

不明なコンテナイメージを取得しようとしているため、タスクがこけています。想定通りですね。

2025-05-06 at 17.41.25-サービスタスク  Elastic Container Service  ap-northeast-1.png

手動ロールバック

本題の手動ロールバックに移ります。失敗しているデプロイ ID をクリックします。

2025-05-06 at 17.40.36-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

すると、右上にロールバックがあるのでクリックします。

2025-05-06 at 17.41.41-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

ロールバックの可否を聞かれます。注意事項を読んでロールバックをクリックしましょう。

2025-05-06 at 17.41.47-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

ロールバックのリクエストが行われました。

2025-05-06 at 17.41.54-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

サービスデプロイに戻ると、ロールバックが行われた旨が記載されています。

2025-05-06 at 17.42.01-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

ロールバックが進行中にステータスが変化しています。

2025-05-06 at 17.42.09-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

サービスデプロイ側でもステータスの変化が確認できます。

2025-05-06 at 17.42.15-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

最後にロールバックが成功で完了です。

2025-05-06 at 17.42.50-サービスデプロイ  Elastic Container Service  ap-northeast-1.png

イベントからもロールバックの履歴を辿れるようになっていました。

2025-05-06 at 17.51.14-サービスイベント  Elastic Container Service  ap-northeast-1.png

また、現行稼働していた ECS タスクも置き換わることなく、ロールバックが完了しています。

2025-05-06 at 17.43.18-サービスタスク  Elastic Container Service  ap-northeast-1.png

まとめ

以上、「Amazon ECS で手動ロールバック(デプロイメントの手動停止)がサポートされました。」でした。

今までやっていた手動ロールバックは一方通行だったため、これはロールバックなのか?と少し疑問に感じていましたが、ついに純粋な手動ロールバックが出てきて嬉しいです。

参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.