

# Amazon ECS のカスタムメトリクスを使用した高度な予測スケーリングポリシー
<a name="predictive-scaling-custom-metrics"></a>

予測スケーリングポリシーで、事前定義されたメトリクスまたはカスタムメトリクスを使用できます。カスタムメトリクスは、CPU、メモリなどの事前定義されたメトリクスが、アプリケーションの負荷を十分に記述するには不十分である場合に有用です。

カスタムメトリクスを使用して予測スケーリングポリシーを作成するときは、AWS が提供するその他の CloudWatch メトリクスを指定できます。または、自分で定義して公開するメトリクスを指定することもできます。メトリクス計算を使用して既存のメトリクスを集計し、AWS が自動的に追跡しない新しい時系列に変換することもできます。例としては、新しい合計や平均を計算してデータ内の値を結合すること (*集計*と呼ばれます) が挙げられます。結果のデータは*集計*と言います。

以下のセクションには、ポリシー用の JSON 構造を構築する方法のベストプラクティスと例が記載されています。

## 前提条件
<a name="predictive-scaling-custom-metrics-prerequisites"></a>

予測スケーリングポリシーにカスタムメトリクスを追加するには、`cloudwatch:GetMetricData` 許可が必要です。

AWS が提供するメトリクスの代わりに独自のメトリクスを指定するには、まずそのメトリクスを CloudWatch に発行する必要があります。詳細については、「*Amazon CloudWatch ユーザーガイド*」の「[カスタムメトリクスの発行](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)」を参照してください。

独自のメトリクスを発行するときは、少なくとも 5 分間隔の頻度でデータポイントを発行するようにしてください。データポイントは、必要な期間の長さに基づいて CloudWatch から取得されます。例えば、負荷メトリクスの指定では、時間単位のメトリクスを使用してアプリケーションの負荷を測定します。CloudWatch は、発行されたメトリクスデータを使用して、各 1 時間の期間内にタイムスタンプがあるすべてのデータポイントを集計することにより、各 1 時間の期間に対して単一のデータ値を提供します。

## ベストプラクティス
<a name="predictive-scaling-custom-metrics-best-practices"></a>

次のベストプラクティスは、カスタムメトリクスをより効果的に使用するのに役立ちます。
+ 負荷メトリクス仕様で最も有用なメトリクスは、Auto Scaling グループ全体の負荷を表すメトリクスです。
+ スケーリングメトリクス仕様のスケールに最も有用なメトリクスは、タスクメトリクスごとの平均スループットまたは使用率です。
+ ターゲット使用率は、スケーリングメトリクスのタイプと一致する必要があります。例えば、CPU 使用率を使用するポリシー設定の場合、これはパーセンテージのターゲットです。
+ これらの推奨事項に従わない場合、予測される将来の時系列の値は、多くの場合、誤りになります。データが正しいことを確認するために、コンソールで予測値を表示できます。または、予測スケーリングポリシーを作成した後、[GetPredictiveScalingForecast](https://docs.aws.amazon.com/autoscaling/application/APIReference/API_GetPredictiveScalingForecast.html) API を呼び出して返された `LoadForecast` オブジェクトを検査します。
+ 予測スケーリングがアクティブスケーリングを開始する前に予測を評価できるように、予測のみモードで予測スケーリングを設定することを強くお勧めします。

## 制限事項
<a name="predicitve-scaling-custom-metrics-limitations"></a>
+ 1 つのメトリクス指定で最大 10 個のメトリクスのデータポイントをクエリできます。
+ この制限に関しては、1 つの式は 1 つのメトリクスとしてカウントされます。

## カスタムメトリクスを使用した予測スケーリングポリシーのトラブルシューティング
<a name="predictive-scaling-custom-metrics-troubleshooting"></a>

カスタムメトリクスの使用中に問題が発生した場合は、次の操作を実行することをお勧めします。
+ 検索式の使用中にブルー/グリーンデプロイで問題が発生した場合は、完全一致ではなく部分一致を検索する検索式を作成してください。また、クエリが特定のアプリケーションで実行されている Auto Scaling グループのみを検索していることも確認する必要があります。検索式の構文の詳細については、「*Amazon CloudWatch ユーザーガイド*」の「[CloudWatch 検索式の構文](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html)」を参照してください。
+ [put-scaling-policy](https://docs.aws.amazon.com/cli/latest/reference/application-autoscaling/put-scaling-policy.html) コマンドは、スケーリングポリシーの作成時に式を検証します。ただし、このコマンドでは、検出されたエラーの正確な原因を特定できない可能性があります。問題を解決するには、[get-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-data.html) コマンドへのリクエストからの応答で受け取ったエラーをトラブルシューティングします。CloudWatch コンソールから式をトラブルシューティングすることもできます。
+ `MetricDataQueries` で SUM() のような数学関数を使用せずに、独自の SEARCH() 関数を指定する場合、`ReturnData` に `false` を指定する必要があります。これは、検索式が複数の時系列を返す可能性がある一方、数式に基づくメトリクス指定は 1 つの時系列しか返すことができないためです。
+ 検索式に含まれるすべてのメトリクスは、同じ解像度である必要があります。

## メトリクス計算を使用してメトリクスを組み合わせる予測スケーリングポリシーの例 (AWS CLI)
<a name="custom-metrics-ex2"></a>

場合によっては、メトリクスを直接指定するのではなく、まず何らかの方法でそのデータを処理する必要がある場合があります。例えば、Amazon SQS キューから作業を取り出すアプリケーションがあり、キュー内の項目数を予測スケーリングの基準として使用したいとします。キューにあるメッセージの数だけでは、必要なインスタンスの数は定義されません。インスタンスごとのバックログを計算するために使用できるメトリクスを作成するには、さらに多くの作業が必要です。

このシナリオの予測スケーリングポリシー例を次に示します。Amazon SQS `ApproximateNumberOfMessagesVisible` メトリクス (キューから取得可能なメッセージの数) に基づくスケーリングメトリクスおよび負荷メトリクスを指定します。Amazon EC2 Auto Scaling `GroupInServiceInstances` メトリクスと、スケーリングメトリクスのインスタンスごとのバックログを計算するための数式も使用します。

```
aws application-autoscaling put-scaling-policy --policy-name {{my-sqs-custom-metrics-policy}} \
  --policy-type PredictiveScaling \
  --predictive-scaling-configuration {{file://config.json}}
  --service-namespace ecs \
  --resource-id service/MyCluster/test \
  "MetricSpecifications": [
    {
      "TargetValue": {{100}},
      "CustomizedScalingMetricSpecification": {
        "MetricDataQueries": [
          {
            "Label": "Get the queue size (the number of messages waiting to be processed)",
            "Id": "{{queue_size}}",
            "MetricStat": {
              "Metric": {
                "MetricName": "{{ApproximateNumberOfMessagesVisible}}",
                "Namespace": "{{AWS/SQS}}",
                "Dimensions": [
                  {
                    "Name": "{{QueueName}}",
                    "Value": "{{my-queue}}"
                  }
                ]
              },
              "Stat": "{{Sum}}"
            },
            "ReturnData": false
          },
          {
            "Label": "Get the group size (the number of running instances)",
            "Id": "{{running_capacity}}",
            "MetricStat": {
              "Metric": {
                "MetricName": "{{GroupInServiceInstances}}",
                "Namespace": "{{AWS/AutoScaling}}",
                "Dimensions": [
                  {
                    "Name": "{{AutoScalingGroupName}}",
                    "Value": "{{my-asg}}"
                  }
                ]
              },
              "Stat": "{{Sum}}"
            },
            "ReturnData": false
          },
          {
            "Label": "Calculate the backlog per instance",
            "Id": "{{scaling_metric}}",
            "Expression": "{{queue_size / running_capacity}}",
            "ReturnData": true
          }
        ]
      },
      "CustomizedLoadMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "{{load_metric}}",
            "MetricStat": {
              "Metric": {
                "MetricName": "{{ApproximateNumberOfMessagesVisible}}",
                "Namespace": "{{AWS/SQS}}",
                "Dimensions": [
                  {
                    "Name": "{{QueueName}}",
                    "Value": "{{my-queue}}"
                  }
                ],
              },
              "Stat": "{{Sum}}"
            },
            "ReturnData": true
          }
        ]
      }
    }
  ]
}
```

この例では、ポリシーの ARN が返されます。

```
{
  "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-sqs-custom-metrics-policy",
  "Alarms": []
}
```