🎚️

Amazon ECS 予測不能な負荷急増に対するアプリケーションの耐障害性を向上

2023/10/24に公開

背景

Amazon ECS において予測不能な負荷急増は、突然のアクセス増加やシステムの変更などが原因で発生する可能性があります。これはアプリケーションのパフォーマンスを低下させ、サービスの中断を引き起こす可能性があります。

Amazon ECSの旧システムでは、タスクがヘルスチェックに失敗するとすぐに終了され、新しいタスクが開始されます。しかし、これはサービスの中断時間を引き起こす可能性がありました。

この図は、ユーザーがアプリケーションを開始し、ECSが不健康なタスクのヘルスチェックを実行し、不健康なタスクがヘルスチェックに失敗するとすぐに終了することを示しています。

この背景に対し、Amazon ECSはタスクのスケジューリング方法を改善し、アプリケーションの耐障害性を向上させる必要がありました。

課題

旧システムでは、負荷急増時にタスクが不健康になると、新しいタスクが開始されるまでの間にサービスが一時的に中断する可能性がありました。このサービスの中断は、ユーザーに対してエラーや遅延を引き起こす可能性があり、アプリケーションの可用性とユーザー体験に悪影響を与える恐れがありました。

また、オートスケーリングは新しいタスクを追加することができますが、アプリケーションのコードや設定に問題がある場合、新しいタスクもすぐに不健康になる可能性がありました。このようなシナリオでは、オートスケーリングだけではアプリケーションの耐障害性を十分に向上させることは困難でした。

解決

上記のような課題に対して 2023年10月23日 に新機能が発表されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/10/amazon-ecs-applications-resiliency-unpredictable-load-spikes/

Amazon ECSはタスクスケジューリングを改善し、不健康なタスクがある場合、そのタスクを終了する前に新しい健康なタスクを開始するようにしました。これにより、サービスの連続性が保たれ、アプリケーションの可用性が向上します。

この図では、新しい健康なタスクが開始されてから古い不健康なタスクが終了されるプロセスを示しています。これにより、サービスの中断を最小限に抑えることができます。

解説

新しい改善において、ユーザーはmaximumPercentパラメータを設定することで、同時に開始できるタスクの代替の最大数を制御できます。デフォルトでは200%に設定されており、これによりユーザーはアプリケーションの需要に応じてタスクのスケジューリングを柔軟に調整できます。

また、ヘルスチェックとロードバランサのチェックを定義することで、Amazon ECSスケジューラに不健康なタスクを終了し、新しいタスクで置き換えるタイミングを知らせることができます。これにより、負荷の変動に柔軟に対応し、アプリケーションの耐障害性をさらに向上させることが可能となります。

一言

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html
上記URLには maximumPercent のデフォルトは 100% と書いてあるが、 以下のアナウンスではデフォルトが 200% になったと書かれてますね。(そもそも日本語ドキュメントは古いのでそちらを見ないようにw)
https://aws.amazon.com/jp/about-aws/whats-new/2023/10/amazon-ecs-applications-resiliency-unpredictable-load-spikes/
どちらが正しいのか念のため確認してみた。

aws ecs describe-services \
--cluster {cluster} \
--services {service} \
| jq '.services[0].deploymentConfiguration.maximumPercent'
200

おー!
もう 200% になってる!

Discussion