ターゲット追跡スケーリングポリシー - Amazon Elastic Container Service

ターゲット追跡スケーリングポリシー

ターゲット追跡スケーリングポリシーでは、メトリクスを選択してターゲット値を設定します。Amazon ECS サービスの Auto Scaling はスケーリングポリシーをトリガーする CloudWatch アラームを作成および管理し、メトリクスとターゲット値に基づいてスケーリング調整値を計算します。スケーリングポリシーは、指定されたターゲット値、またはそれに近い値にメトリクスを維持するため、必要に応じてサービスタスクを追加または削除します。ターゲットの追跡スケーリングポリシーは、メトリクスをターゲット値近くに維持することに加えて、負荷パターンの変動によるメトリクスの変動に合わせて調整し、サービスで実行されているタスク数の急速な変動を最小化します。

考慮事項

次の考慮事項に注意が必要です。

  • ターゲットの追跡スケーリングポリシーでは、指定されたメトリクスがターゲット値を超えている場合、スケールアウトする必要があると見なされます。指定されたメトリクスがターゲット値を下回っている場合、ターゲットの追跡スケーリングポリシーを使用してスケールアウトすることはできません。

  • 指定されたメトリクスに十分なデータがない場合、ターゲットの追跡スケーリングポリシーによってスケールされません。不十分なデータは低い使用率として解釈されないため、スケールインされません。

  • ターゲット値と実際のメトリクスデータポイント間にギャップが発生する場合があります。これは、サービスの Auto Scaling が追加または削除する容量を決定するときに、その数を切り上げまたは切り捨てて常に控えめに動作するためです。これにより、不十分な容量を追加したり、必要以上に容量を削除することを防ぎます。

  • アプリケーションの可用性を高めるために、サービスのスケールアウトはメトリクスに比例して可能な限り高速に行われますが、スケールインはより緩やかです。

  • Amazon ECS サービスに対して複数のターゲット追跡スケーリングポリシーを設定できます。ただし、各ポリシーがそれぞれ異なるメトリクスを使用している必要があります。サービスの Auto Scaling の目的は常に可用性を優先することであるため、その動作は、ターゲット追跡ポリシーでスケールアウトまたはスケールインの準備ができているかによって異なります。ターゲット追跡ポリシーのいずれかでスケールアウトする準備ができると、サービスがスケールアウトされますが、すべてのターゲット追跡ポリシー (スケールイン部分が有効) でスケールインする準備ができている場合にのみスケールインされます。

  • ターゲット追跡スケーリングポリシー用に サービスの Auto Scaling によって管理されている CloudWatch アラームを編集または削除しないでください。スケーリングポリシーを削除すると、サービスの Auto Scaling によって自動的にアラームが削除されます。

チュートリアル: ターゲット追跡を伴うサービスの Auto Scaling

以下の手順は、Amazon ECS クラスターを作成するために、また、ターゲット追跡を使用して需要に基づいて自動的にスケールアウト (およびイン) するサービスを作成するために役立ちます。

このチュートリアルでは、Amazon ECS 初回実行ウィザードを使用してクラスターとサービス (Elastic Load Balancing ロードバランサーの背後で実行) を作成します。その後、サービスの CPU 使用率 (CloudWatch の ECS、ClusterName、ServiceName カテゴリからのもの) で測定される現在のアプリケーション負荷に基づいてサービスを自動的にスケーリングする、ターゲット追跡スケーリングポリシーを設定します。

サービスの CPU 平均使用率が 75% を上回ると (サービス用に予約されている CPU が 75% より多く使用されると)、スケールアウトアラームがトリガーされて サービスの Auto Scaling が開始され、増加した負荷に応じてサービスに別のタスクが追加されます。逆に、サービスの CPU 平均使用率が一定期間ターゲットの使用率を下回ると、スケールインアラームがトリガーされてサービスの必要タスク数が減らされ、それらのクラスターリソースが他のタスクやサービス用に解放されます。

前提条件

このチュートリアルでは、管理者の認証情報を使用しており、現在のリージョンに Amazon EC2 キーペアがあることを前提としています。これらのリソースがないか、わからない場合は、「Amazon ECS でのセットアップ」の手順に従ってリソースを作成できます。

ステップ 1: クラスターとサービスを作成する

Amazon ECS 初回実行ウィザードを使用してクラスターとサービスを作成することから始めます。初回実行ウィザードでは、このチュートリアルに必要な IAM ロール、コンテナインスタンス用の Auto Scaling グループ、ロードバランサーの背後で実行されるサービスを作成します。また、このウィザードでは、AWS CloudFormation スタック全体をワンステップで削除できるため、クリーンアッププロセスが大幅に簡単になります。

このチュートリアルでは、service-autoscaling という名前のクラスターと sample-webapp という名前のサービスを作成します。

クラスターとサービスを作成するには

  1. Amazon ECS コンソールの初回実行ウィザード (https://console.aws.amazon.com/ecs/home#/firstRun) を開きます。

  2. ナビゲーションバーから、[米国東部 (バージニア北部)] リージョンを選択します。

  3. [ステップ 1: コンテナとタスク] の [コンテナの定義] で、[sample-app] を選択します。

  4. [タスク定義] では、すべてのデフォルトのオプションを変更しないで、[次へ] を選択します。

  5. [ステップ 2: サービス] の [ロードバランサーの種類] で、[Application Load Balancer]、[次へ] の順に選択します。

    重要

    Application Load Balancer が AWS リソースに存在する間、コストが発生します。詳細については、「Elastic Load Balancing 料金表」を参照してください。

  6. [ステップ 3: クラスター] の [クラスター名] に「service-autoscaling」と入力し、[次へ] を選択します。

  7. 選択内容を確認し、[作成] を選択します。

    [作成ステータス] ページに進みます。このページでは、起動ステータスが示され、プロセスの各ステップについて説明されます (クラスターのリソースが作成されて入力されるまでに数分かかる場合があります)。

  8. クラスターとサービスが作成されたら、[サービスの表示] を選択します。

ステップ 2: サービスの Auto Scaling の設定

クラスターを起動し、ロードバランサーの背後で実行されるサービスをそのクラスターに作成したので、ターゲット追跡スケーリングポリシーを作成することで サービスの Auto Scaling を有効にできます。

基本的な サービスの Auto Scaling パラメータを設定するには

  1. [Service: sample-app-service (サービス: sample-app-service)] ページで、サービス設定は次の画像のようになっています (ただし、タスク定義のリビジョンとロードバランサー名は異なります)。[Update] を選択して、新しいサービスを更新します。

    
                                設定オプションの選択
  2. [サービスの更新] ページで、[次のステップ] を選択して [ステップ 3: Auto Scaling の設定 (省略可能)] まで進みます。

  3. [サービスの Auto Scaling] で、[Configure Service Auto Scaling to adjust your service's desired count (サービス Auto Scaling の設定を変更することで、サービスの必要数を調整する)] を選択します。

  4. [Minimum number of tasks (タスクの最小数)] に、サービスの Auto Scaling で使用するタスクの下限数として 1 と入力します。サービスの必要数は、この数を下回ると自動的に調整されません。

  5. [タスクの必要数] には、前に入力した値があらかじめ入力されています。この値は、このページで指定したタスクの最小数と最大数の間であることが必要です。この値は 1 のままにします。

  6. [Maximum number of tasks (タスクの最大数)] に、サービスの Auto Scaling で使用するタスクの上限数として 2 と入力します。サービスの必要数は、この数を上回ると自動的に調整されません。

  7. [IAM role for Service Auto Scaling (サービスの自動スケーリング用の IAM ロール)] で、ecsAutoscaleRole を選択します。このロールが存在しない場合は、[新しいロールの作成] を選択して、コンソールで作成します。

サービスのターゲット追跡スケーリングポリシーを設定するには

  1. [スケーリングポリシーの追加] を選択してスケーリングポリシーを設定します。

  2. [Add policy (ポリシーの追加)] ページで、以下のフィールドを更新します。

    1. [スケーリングポリシータイプ] で [ターゲットの追跡] を選択します。

    2. [ポリシー名] に「TargetTrackingPolicy」と入力します。

    3. [ECS サービスメトリクス] で、[ECSServiceAverageCPUUtilization] を選択します。

    4. [ターゲット値] に「75」と入力します。

    5. [スケールアウトクールダウン期間] に「60」と入力します。スケールアウトアクティビティは、サービスのタスクの数を増やします。スケールアウトのクールダウン期間が有効な間は、その期間中にクールダウンを開始したスケールアウトアクティビティによって追加された容量は、次のスケールアウトに予定される容量の一部として繰り入れられます。これにより、スケールアウトが継続的に (ただし過剰になることなく) 行われます。

    6. [スケールインクールダウン期間] に「60」(秒) と入力します。スケールインアクティビティは、サービスのタスクの数を減らします。スケールインのクールダウン期間は、その期間が過ぎるまでは以後のスケールインリクエストをブロックするために使用されます。これにより、スケールインが抑制されてアプリケーションの可用性が確保されます。ただし、スケールイン後のクールダウン期間中に別のアラームによってスケールアウトアクティビティがトリガーされると、サービスの Auto Scaling によってスケーラブルなターゲットが即座にスケールアウトされます。

    7. [Save] を選択します。

  3. [Next step] を選択します。

  4. すべての選択内容を確認し、[サービスを更新] を選択します。

  5. サービスステータスの更新が終了したら、[View Service] を選択します。

ステップ 3: スケーリングアクティビティをトリガーする

サービスを サービスの Auto Scaling で設定した後、サービスの CPU 使用率を ALARM 状態にプッシュすることで、スケーリングアクティビティをトリガーできます。このチュートリアルの例はロードバランサーの背後で実行されるウェブアプリケーションであるため、ApacheBench ユーティリティを使用して数千の HTTP リクエストをサービスに送信することで、しきい値を上回るようにサービスの CPU 使用率をスパイクできます。このスパイクによりアラームがトリガーされることで、サービスに 1 タスクを追加するスケーリングアクティビティがトリガーされます。

ApacheBench ユーティリティからのリクエストが終了した後、サービスの CPU 使用率は 75% のしきい値を下回って、サービスの必要タスク数を 1 に戻すスケールインアクティビティがトリガーされます。

サービスのスケーリングアクティビティをトリガーするには

  1. Amazon EC2 コンソールで、サービスのメインビューページからロードバランサー名を選択すると、その詳細が表示されます。ロードバランサーの DNS 名が必要です。この名前は EC2Contai-EcsElast-SMAKV74U23PH-96652279.us-east-1.elb.amazonaws.com のようになります。

  2. ApacheBench (ab) ユーティリティを使用して、ロードバランサーに短期間に数千の HTTP リクエストを送信します。

    注記

    このコマンドは macOS にデフォルトでインストールされており、多くの Linux ディストリビューションでも使用できます。たとえば、以下のコマンドを使用して Amazon Linux に ab をインストールできます。

    $ sudo yum install -y httpd24-tools

    以下のコマンドを実行します (DNS 名はロードバランサーの DNS 名に置き換えます)。

    $ ab -n 100000 -c 1000 http://EC2Contai-EcsElast-SMAKV74U23PH-96652279.us-east-1.elb.amazonaws.com/
  3. https://console.aws.amazon.com/cloudwatch/ にある CloudWatch コンソールを開きます。

  4. 左側のナビゲーションペインで [アラーム] を選択します。

  5. ab HTTP リクエストによって CloudWatch コンソールのスケールアウトアラームがトリガーされるのを待ちます。Amazon ECS サービスがスケールアウトされて、そのサービスの必要数に 1 タスクが追加されています。

  6. ab HTTP リクエストが完了するとすぐに (1、2 分間で)、スケールインアラームがトリガーされ、スケールインポリシーによりサービスの必要数が 1 に戻ります。

ステップ 4: 次のステップ

このチュートリアル用に作成した基本インフラストラクチャを削除する場合は、次のステップに進みます。それ以外の場合は、ベースとしてこのインフラストラクチャを使用し、次の 1 つ以上を試すことができます。

  • Amazon ECS コンソールからこれらのスケーリングアクティビティを表示するには、サービスの [Events (イベント)] タブを選択します。スケーリングイベントが発生すると、ここに通知メッセージが表示されます。次に例を示します。

    Message: Successfully set desired count to 1. Change successfully fulfilled by ecs. Cause: monitor alarm TargetTracking-service/service-autoscaling/sample-webapp-AlarmLow-fcd80aef-5161-4890-aeb4-35dde11ff42c in state ALARM triggered policy TargetTrackingPolicy
  • CloudWatch Container Insights の設定が完了し、Amazon ECS メトリクスの収集が開始されたら、それらのメトリクスデータを CloudWatch 自動ダッシュボードで表示できます。詳細については、AWS コンピューティングブログの「Amazon ECS 用 Amazon CloudWatch Container Insights の紹介」を参照してください。

  • CloudWatch Container Insights の設定方法について説明します。追加の変更が適用されます。詳細については、「Amazon ECS CloudWatch Container Insights」および「クラスター設定の更新」を参照してください。

ステップ 5: クリーンアップする

このチュートリアルを完了したら、クラスター、Auto Scaling グループ、ロードバランサー、ターゲット追跡スケーリングポリシー、CloudWatch アラームを維持するように選択できます。ただし、これらのリソースをアクティブに使用していない場合は、アカウントで不要な料金が発生しないように、リソースのクリーンアップを検討する必要があります。

クラスターを削除するには

  1. Amazon ECS コンソール (https://console.aws.amazon.com/ecs) を開きます。

  2. 左のナビゲーションペインで [Clusters (クラスター)] を選択します。

  3. [クラスター] ページで、[service-autoscaling] クラスターを選択します。

  4. [クラスターの削除]、[削除] の順に選択します。クラスター AWS CloudFormation スタックのクリーンアップが終了するまでに数分かかることがあります。