Amazon Web Services ブログ

予測スケーリングを用いて Amazon ECS のコンピューティングリソースを最適化する

この記事は Optimize compute resources on Amazon ECS with Predictive Scaling (記事公開日 : 2024 年 11 月 21 日) の翻訳です。

導入

Amazon Elastic Container Service (Amazon ECS) は、AWS と深く統合され、簡単に利用可能なコンテナオーケストレーションサービスです。Amazon ECS は、あらゆる規模のコンテナアプリケーションのデプロイと管理を効率化します。Amazon ECS のリソースを効率的に管理する上で重要な機能の 1 つに、サービスオートスケーリングがあります。この機能を利用すると、ECS サービスのタスク数を自動的に調整し、アプリケーションの需要の変化に効率的に対応することができます。

Amazon ECS と Application Auto Scaling の統合により、ターゲット追跡ポリシーまたはステップスケーリングポリシーを使用して、Amazon CloudWatch メトリクスに基づく ECS サービスのオートスケーリングを設定できます。例えば、平均 CPU 使用率やターゲットあたりのリクエスト数、あるいはキューの深さなどの自分で設定したカスタムメトリクスに基づいてタスク数を自動で増減させることができます。また、スケジュールスケーリングを使用すると、予測可能なトラフィックパターンに対して、特定の時間にタスク数を増減させるプロアクティブなスケーリングを実現できます。

本日、Amazon ECS サービスオートスケーリングの新しいスケーリングポリシーである「予測スケーリング」を発表できることを嬉しく思います。このポリシーは、高度な機械学習 (ML) アルゴリズムを用いて需要の急増を予測するように設計されています。予測スケーリングでは、予測に基づいて前もってタスク数を増加させることでアプリケーションの可用性と応答性を向上させると同時に、過剰なプロビジョニングを削減することでコスト削減を実現します。このポリシーはターゲット追跡ポリシーやステップスケーリングポリシーと併用可能なため、リアルタイムの情報と過去のパターンの両方に基づいて、アプリケーションをスケールできます。この記事では、予測スケーリングの概要を説明し、この機能が役立つ場面や実際に予測スケーリングを設定する手順について解説します。

Amazon ECS における予測スケーリング

ECS サービスのスケーリングにおいて、ターゲット追跡ポリシーとステップスケーリングポリシーは効果的ですが、これらは需要の変化を検出した後に動作するリアクティブなポリシーです。このことは、通常、緩やかな需要の変化に対しては大きな問題になりません。しかし、早朝の業務開始時のスパイクのように需要が急激に変化する場合、このようなリアクティブなスケーリングでは、スケーリングアクションが開始され、最適なキャパシティを確保するまでに時間がかかる可能性があります。初期化に時間がかかるアプリケーションの場合には、この時間がさらに長引く可能性があり、需要が急激に変化した際、一時的なパフォーマンス低下を引き起こす可能性があります。

その対策として、一部の利用者は、使用量のメトリクスに対して理想的な値よりも低い閾値を設定し、タスクをオーバープロビジョニングしています。これにより、トラフィックの急増に対応するためのタスクを余分に確保し、スケールアウト時の遅延を相殺します。また、利用者の中には、スケジュールスケーリングを使用して、予測される需要パターンに基づいたスケーリングを手動で設定している方もいます。しかし、スケジュールスケーリングを効果的に活用するには、トラフィックパターンとそれに対応するためのタスク数を手動で特定する必要があります。また、時間の経過とともにトラフィックパターンは変化するため、スケーリングの設定を定期的に調整する必要があります。そのため、実際の需要に対してリソースを最適化し、パフォーマンスの向上と運用コストの削減を実現するために、より効率的かつプロアクティブなスケーリングソリューションが必要とされています。

予測スケーリングを利用することで、需要の急増を予測して、前もってアプリケーションをスケールできるようになります。このアプローチにより、需要が増加する前に、新しいタスクを初期化するための時間を確保できます。予測スケーリングでは、高度な機械学習アルゴリズムを用いて、数百万のデータポイントからアプリケーション固有の需要パターンを継続的に学習することで、時間とともに、より正確な予測とカスタマイズされたスケーリング体験を提供します。このソリューションは、他のリアクティブなスケーリングポリシーと並行して機能するため、予測した需要変化とリアルタイムのメトリクスの両方を考慮した、より高い可用性を実現します。また、予測スケーリングは、予測に基づいたスケールインを実施しません。これは、予期せず需要が急増した際にも、必要なキャパシティを維持するのに役立ちます。スケールインについては、リアクティブなスケーリングポリシーまたはスケジュールスケーリングを利用してください。具体的には、Amazon ECS で予測スケーリングを使用する場合、以下のようなシナリオが想定されます。

  • 複数のスケーリングポリシー (予測スケーリングとターゲット追跡スケーリングなど) を有効化した場合、それぞれが独立して必要なタスク数を見積もります。それぞれの見積もりの最大値が、最終的なタスクの必要数になります。
  • 現在のタスク数が予測したタスクの必要数よりも少ない場合には、Amazon ECS はこれらの値が等しくなるように ECS サービスをスケールアウトします。
  • 現在のタスク数が予測したタスクの必要数を上回っている場合には、Amazon ECS はサービスをスケールインしません。これは、実際に必要な値よりも少ない値を予測した場合にスケールインするのを防ぎ、常に必要なキャパシティを確保できるようにするためです。予測スケーリングと (ターゲット追跡ポリシーなどの) リアクティブなスケーリングポリシーの両方が、現在のタスク数よりも少ない値を見積もった場合にのみ、ECS サービスはスケールインします。
  • 予測したタスクの必要数が、ECS サービスオートスケーリングにおけるタスクの最大数を上回っていて、かつこの上限を無視するオプションを選択している場合、ECS サービスオートスケーリングはその上限を超えてタスクを追加できます。この上限を無視するオプションを選択していない場合には、ECS サービスオートスケーリングは、これらの範囲を超えてスケールすることはありません。

予測スケーリングに関する推奨事項

予測スケーリングは、一貫したパターンに基づいて需要が急激に変化するアプリケーションに最適です。これには、ユーザーが特定の時間に利用開始することで急激なスパイクが発生するような日次や週次のパターンを持つユーザー向けのアプリケーションや、業務時間のパターンに従うような CI/CD ツールなどの社内アプリケーションが含まれます。リアクティブなスケーリングポリシーは、このような急激なスパイクに対して、通常、何回かに分けてスケーリングアクションを実行するため、最適なキャパシティを確保するまでに時間がかかります。この時間は、ロードバランサーへのタスクの登録やアプリケーションの起動、またデータレプリケーションなどの初期化ステップによって、さらに長引く可能性があります。また、予測スケーリングは、リアクティブなスケーリングポリシーが不適切なタイミングでスケールインしようとした際のセーフティネットとしても機能します。例えば、リアクティブなスケーリングポリシーが唯一考慮するリアルタイムのメトリクスは、差し迫った需要の急増を反映していなかったり、デプロイメントや障害などの影響を受けている可能性があります。具体的なユースケースを探るために、以下の例を考えてみましょう。

  • ワークロードは周期的なトラフィックパターンに従い、業務時間中はリソース使用量が増加し、夕方や週末には使用量が減少するという特徴を持つとします。このようなワークロードでは、予測スケーリングを用いてベースラインを設定することで、機械学習アルゴリズムを使用して過去のパターンを認識し、リソースをプロアクティブに管理できます。加えて、急激なスパイクに対しては、リアクティブなポリシーを併用して対処することが推奨されます。
  • ワークロードは、2 時間毎などの特定の時間感覚でオン/オフを繰り返すとします。このベースラインはスケジュールスケーリングで管理できますが、定期実行されるジョブの設定を定期的に分析し、スケーリングの設定を手動で調整する必要があります。予測スケーリングを使用すると、このプロセスを自動化し、手作業の必要性を減らし、適切な間隔で効率的なスケーリングを実現できます。
  • また、初期化に時間がかかるワークロードでは、リアクティブな方法で需要の変化に対応するのが難しくなります。初期化の時間は、特に営業日の業務開始時のような需要の急増において、最適化なキャパシティを確保するまでの時間に遅延をもたらします。また、大量の依存関係や静的なアセットを持つアプリケーションでは、これらの初期化の時間はさらに長引くことが想定されます。特定の時間パターンを示し、長い初期化プロセスを持つアプリケーションの場合には、予測スケーリングを設定することで、需要の変化に迅速に対応することが可能になります。

予測スケーリングの利用方法

予測スケーリングは、現在のオートスケーリングの動作を邪魔することなく利用開始できます。予測スケーリングポリシーには、「予測のみ」と「予測およびスケール」の 2 つのモードがあります。「予測のみ」モードでは、キャパシティの予測を生成するものの、実際にはスケーリングを実施しないため、普段の需要パターンを正確に予測できているか確認することができます。このモードは、本番環境の既存のスケーリング動作に影響を与えないため、予測スケーリングを初めて利用する際に最適です。

さらに、「予測のみ」モードで複数のポリシー (異なるメトリクスやターゲット値に基づいたポリシーなど) を作成することで、異なる設定を比較することができます。予測の精度を確認した後は、アプリケーションに最適なポリシーを選択して、「予測およびスケール」モードに移行できます。このモードに移行すると、予測スケーリングは積極的にスケーリングに関する意思決定を行い、予測される需要のスパイクに対して効果的に対応できるようになります。

ウォークスルー

このセクションでは、これまで説明した予測スケーリングについて、その設定と構築に必要な手順を詳細に説明します。新しい ECS サービスを使用する場合は、予測を生成するために少なくとも 24 時間分のデータが必要です。また、予測の精度はデータが多いほど向上するため、理想的には 2 週間分のデータがあると望ましいです。

予測スケーリングや ECS サービスオートスケーリングを使用する前に、適切な使用量メトリクスとターゲット値を確認してください。例えば、計算負荷の高いアプリケーションであれば、CPU 使用率などが候補になります。最適な設定を見つけるには、ステージング環境で負荷試験を実施するのが良いでしょう。詳細は、Amazon ECS 開発者ガイドを参考にしてください。すでにターゲット追跡またはステップスケーリングを設定している場合は、予測スケーリングにも同じメトリクスを使用してください。また、メトリクスのターゲット値を調整することで、パフォーマンスとコストのバランスを制御します。「予測のみ」モードを使用することで、現在の構成に影響を与えることなく、設定を調整できます。

1. ECS コンソールでは、新しく導入された「サービスの自動スケーリング (Service auto scaling)」タブを使用して、ECS サービスのスケーリングポリシーを確認、設定できるようになりました。ECS サービスの作成時にオートスケーリングを設定していない場合は、このタブからオートスケーリングを有効化できます。このウォークスルーでは、すでにターゲット追跡ポリシーを CPU 使用率 (60%) に対して有効化していると仮定して、そこに予測スケーリングを設定する方法を確認します。まず、「スケーリングポリシーを作成 (Create scaling policy)」をクリックし、予測スケーリングポリシーを作成しましょう。

ECS サービスのオートスケーリング設定画面

図 1 : ECS サービスのオートスケーリング設定画面

2. 以下の設定例では、ECS サービスの事前定義済みのメトリクスである (平均) CPU 使用率を選択しています。追加設定の「起動前のキャパシティ (Pre-launch capacity)」から SchedulingBufferTime 属性を 600 秒に設定することで、スケールアウトアクションを (1 時間単位で) 予測した時刻の 10 分前に開始するように設定できます。

予測スケーリングの作成

図 2 : 予測スケーリングの作成

最初は「予測のみ」モードを選択することをオススメします。これにより、実際に利用開始する前に、予測の精度と適合性を評価できます。

「予測のみ」モードと「予測とスケール」モード

図 3 :「予測のみ」モードと「予測とスケール」モード

注 : 予測スケーリングは、ECS サービスの作成/更新画面からは設定できません。予測スケーリングを設定するには、ECS サービスを作成後、サービスの「サービスの自動スケーリング (Service auto scaling)」タブを使用してください。

3. 「予測のみ」モードで少なくとも 2 つのポリシーを持つことで、異なるメトリクス値を使用するポリシーを比較評価できます。ステップ 2 に戻って、異なるメトリクス値で予測スケーリングを設定してみましょう。例えば、以下のように複数のポリシーを設定できます。

複数の予測スケーリングポリシーの設定

図 4 : 複数の予測スケーリングポリシーの設定

4. ポリシーを作成すると、予測スケーリングは最大 14 日間の過去データを分析し、この先の 48 時間に対して 1 時間単位で予測を生成します。これらの予測は、6 時間ごとに CloudWatch の新しいデータで更新され、時間とともに精度が向上します。

5. 一定時間が経過すると、「レコメンデーション」タブでは、予測スケーリングポリシーに関する推奨事項が表示されます。ここでは、そのポリシーを使用することによるコストと可用性への影響を確認できます。これらの分析は、オートスケーリングの設定を最適化するのに役立ちます。また、すべてのポリシーが「予測のみ」モードで存在する場合、より高い可用性を低いコストで実現するポリシーに対して、「最適 (Best prediction)」タグが付与されます。「最適」としてタグ付けされたポリシーを、そのまま「予測およびスケール」モードに移行させることができます。

注 : 予測スケーリングの予測と推奨事項にアクセスするには、追加の IAM 権限 (application-autoscaling:GetPredictiveScalingForecast) が必要です。

予測スケーリングポリシーに関する推奨事項

図 5 : 予測スケーリングポリシーに関する推奨事項

6. 「チャートを表示 (View chart)」をクリックすると、実際のデータと予測値を比較して、予測モデルの精度を評価することができます。

予測スケーリングの実測値と予測値

図 6 : 予測スケーリングの実測値と予測値 (左 : 負荷、右 : キャパシティ)

7. 以下の ECS コンソール画面の例のように、予測スケーリングと動的なスケーリング (ターゲット追跡) ポリシーを組み合わせることで、ECS サービスを効果的にスケールできます。予測スケーリングはベースラインのキャパシティとして利用され、動的なスケーリングは現在の使用状況に基づいて追加のキャパシティを調整します。Amazon ECS は、スケジュールスケーリングを除いたすべてのポリシーが推奨するタスク数をそれぞれ計算し、その最大値をもとにスケーリングを実施します。

予測スケーリングと動的なスケーリングを組み合わせた設定

図 7 : 予測スケーリングと動的なスケーリングを組み合わせた設定

8. 「スケーリングアクティビティ (Scaling activity)」セクションでは、過去のスケーリングに関する詳細なビューが提供され、スケーリングポリシーの動作に関する洞察を得ることができます。

ECS サービスのスケーリングアクティビティ一覧

図 8 : ECS サービスのスケーリングアクティビティ一覧

まとめ

新しく導入された予測スケーリングは、リアクティブなスケーリングと組み合わせることで、予測した需要変化とリアルタイムのメトリクスに対応して、必要な数のタスクを確実に実行できるように機能します。これにより、可用性と応答性の高いアプリケーションを構築しながら、リソースを効率的に使用してコストを最適化できます。

予測スケーリングを利用開始する際は、まずは「予測のみ」モードを有効化して、実際にはスケーリングを行わず、予測したキャパシティについて可視化するところから始めましょう。これをもとに、適切なメトリクスを検討し、適切なターゲット値を調整することで、予測スケーリングポリシーを改善します。準備が完了したタイミングで「予測およびスケール」モードに移行し、予測したキャパシティに基づいて、ECS サービスをプロアクティブにスケールさせることができます。

この機能についてさらに詳しく知りたい方は、Amazon ECS 開発者ガイドの予測スケーリングに関するセクションを参照してください。Amazon ECS コンソール、AWS SDK、または AWS CLI を使用して、ECS サービスの予測スケーリングを設定できます。AWS コンテナサービスロードマップにて、皆様からのフィードバックや提案をお待ちしています。