ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

ECS (Fargate) のAutoScalingにおける2つのスケールアウト条件合致時の動作について

みなさん、こんにちは!

AWSグループの大澤 (@yukiblue63) です。

今回は、ECS (Fargate)環境にて、AutoScalingを設定したときのタスクのスケールアウト動作について気になったため、動作について検証いたしました。

背景

ECS (Fargate)にて、下記のような状況が発生したとき、どのようにタスクがスケールアウトするのかが気になりました。

・サービスに対するCPU使用率があるしきい値を超えたらタスクを1つスケールアウトさせる

・サービスに対するメモリ使用率があるしきい値タスクを1つスケールアウトさせる

・CPU使用率とメモリ使用率が同時にしきい値を超えた場合は、1つのみスケールアウトさせる

・通常時はタスク1つで稼働し、負荷が上昇する状況の場合は、タスクを2つとする。

前提情報

今回は、下記を実験します。

パターン1

 ・ECS (Fargate)のサービスの設定において、必要なタスクは1として、サービスの自動スケーリングを最小1〜最大3、CPU使用率とメモリ使用率両方の条件で設定を行う

 ・AWS Fault Injection Service (AWS FIS) にて、サービス内タスクの1つのCPU使用率に負荷をかける

 ・メモリへの負荷はAWS FISでは実験できないため、しきい値を低く設定し、CPU使用率とメモリ使用率の2条件が同時にしきい値以上になるようにする。

 ・スケールアウトクールダウン・スケールインクールダウン期間は300秒(5分)に設定

パターン2

 ・ほぼパターン1と同じだが、ECS (Fargate)のサービスの設定において、必要なタスクは1として、サービスの自動スケーリングを最小1〜最大2、CPU使用率とメモリ使用率両方の条件で設定を行う

  ・AutoScalingによって最大のタスク2に制限することで、2つの条件が同時に満たされても、1つのみスケールアウトされるかどうかを確認

  ・スケールアウトクールダウン・スケールインクールダウン期間は300秒(5分)に設定

手順

下記画像のように、対象クラスタのサービス内のタスクが1つある状態にしておきます。

AWS FIS にて実験テンプレートを作成して、ECSのタスクのCPU負荷をかけるためのアクションを定義し、実験を開始します。

※ AWS FISで負荷をかけるための準備は、AWS FISでECSタスクにCPU負荷をかけてみる (別サイト記事) ご参考ください。

ECSのサービスのコンソール画面にて、CPU使用率の負荷が上昇していることを確認します。

サービスの自動スケーリングを最小1〜最大3、CPU使用率とメモリ使用率両方の条件で設定します。 パターン2では、最大値を2としています。 (今回は検証ということで、2つのスケールアウト条件を満たすために低いしきい値にしています)

結果

パターン1

2つのスケールアウト条件を満たすと、クールダウンタイムの300秒を待たずに、AutoScalingの最大タスク範囲内でタスクのスケールアウトが行われる

パターン1では、2つの条件を同時に満たす場合に、2つのスケールアウトポリシーが同時に動作するのか確認したかったため、予想していた動作となりました。 クールダウンタイムの設定は、1つのスケールアウトポリシーに対してという仕様となるようです。

パターン2

2つのスケールアウト条件を満たすと、AutoScalingの最大タスク範囲内でタスクのスケールアウトが行われるため、2つのタスクまでスケールアウトする

パターン1での結果を踏まえ、確認のためにパターン2を実施しましたが、2つのスケールアウトポリシーを満たしたとしても設定した最大タスク数以上にはスケールアウトされないという仕様であることが分かりました。

補足

CloudWatch アラームのトリガーとして、AutoScalingアクションにてECSサービスを選択できますが、対象としいECSサービスが選択できませんでした。

したがって、ECS (Fargate)を対象とする場合は、ECSサービスの設定画面から、AutoScalingを組む必要があります。

まとめ

・ECS (Fargate)環境におけるタスクのAutoScalingは、CPU使用率・メモリ使用率の2要素でスケールアウトポリシーを容易に作成可能だが、2つのポリシーが同時に発動要件を満たした場合、AutoScalingの最大タスク数に設定した範囲内でタスクのスケールが行われる。

・ポリシーごとのクールダウンタイムの設定は、1つのポリシーに対して影響する仕様となっており、2つのポリシーが同時に発動条件を満たした場合は、クールダウンタイムの設定を考慮せずに、最小〜最大タスク数の範囲でスケールアウトが行われる。

・CloudWatch アラームのトリガーとして、ECS (Fargate)のサービスにおけるタスクのスケールアウトは設定できず、ECSのコンソール上から設定を行う必要がある。

今回は、ECS (Fargate) 環境における、AutoScalingについての検証をテーマとしましたが、触ってみないと把握しづらい箇所の仕様を理解することができました。 実環境で、AutoScalingを設定されることも多いと思いますので、ぜひ参考としていただければと思います。