0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudWatchでStatisticSetを使ってメトリクス送信を効率化する方法 - ECSタスクでのAPI呼び出し削減テクニック

0
Posted at

概要

CloudWatchカスタムメトリクスは便利ですが、大量のデータポイントを送信するとAPI呼び出し料金がかさみます。StatisticSetを使えば、複数のデータポイントを集約して送信でき、API呼び出し数を大幅に削減できます。本記事では、ECSタスクを例にStatisticSetの実装方法と効率化のポイントを解説します。

目次

  1. CloudWatchカスタムメトリクスとPutMetricData APIの基本
  2. StatisticSetとは
  3. StatisticSetの使用例(ECSタスク)
  4. StatisticSetの制約事項と注意点
  5. 料金比較と削減効果
  6. 終わりに
  7. 参考文献・参考サイト

1. CloudWatchカスタムメトリクスとPutMetricData APIの基本

CloudWatchカスタムメトリクスの課金体系

CloudWatchカスタムメトリクスを送信する際、重要なのは「API呼び出し回数」に料金が発生するという点です。AWS公式ドキュメント ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html ) では、カスタムメトリクスの送信にはPutMetricData APIを使用することが説明されています。

2025年11月時点のap-northeast-1(東京リージョン)における料金は、カスタムメトリクス1件あたり月額0.30 USDです。さらに、API呼び出し1,000件ごとに0.01 USDの料金が発生します。少量のメトリクスでは気になりませんが、多数のECSタスクやLambda関数から頻繁にメトリクスを送信する場合、API呼び出し料金は無視できないコストになります。

注意: 料金は変動する可能性があります。最新の料金情報は AWS CloudWatch 料金ページ ( https://aws.amazon.com/jp/cloudwatch/pricing/ ) でご確認ください。

PutMetricData APIの基本

PutMetricData APIは、CloudWatchにカスタムメトリクスデータを送信するためのAPIです。AWS CLI ( https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html ) を使用した基本的な使い方は以下の通りです。

aws cloudwatch put-metric-data \
  --namespace "MyApp/ECS" \
  --metric-name "TaskMemoryUsage" \
  --dimensions TaskId=abc123 \
  --value 512 \
  --unit Megabytes \
  --region ap-northeast-1

このコマンドでは、1つのデータポイント(メモリ使用量512MB)を送信します。1回のAPI呼び出しで1つのメトリクスを送信する形です。

PutMetricData APIの重要な特性

AWS公式ドキュメント ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricData.html ) によると、PutMetricData APIには以下の特性があります。

  • 1回のリクエストで最大1,000個の異なるメトリクスを送信可能
  • リクエストサイズの上限は1MB(HTTP POST)
  • タイムスタンプは過去2週間から未来2時間まで指定可能
  • 同じNamespace内であれば、異なるMetricName・Dimensionの組み合わせも1回の呼び出しに同梱可能

この特性を活かすことで、API呼び出し数を削減できます。

2. StatisticSetとは

通常の単一値送信(Value)との違い

通常、メトリクスを送信する際はValueパラメータで単一の値を指定します。例えば、5秒ごとにメモリ使用量を測定して送信する場合、1分間で12回のAPI呼び出しが必要です。

# 5秒ごとに個別送信(12回のAPI呼び出し)
aws cloudwatch put-metric-data --namespace "MyApp/ECS" \
  --metric-name "MemoryUsage" --value 512 --timestamp 2025-11-15T10:00:00Z
aws cloudwatch put-metric-data --namespace "MyApp/ECS" \
  --metric-name "MemoryUsage" --value 520 --timestamp 2025-11-15T10:00:05Z
# ... 以下10回続く

これに対して、StatisticSetを使用すると、複数のデータポイントを統計情報として集約して1回で送信できます。

StatisticSetの4つのパラメータ

StatisticSetは、AWS公式ドキュメント ( https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html ) によると、以下の4つのパラメータで構成されます。

パラメータ 説明
Sum 測定値の合計 6,120(12個のデータポイントの合計)
SampleCount サンプル数 12(測定回数)
Minimum 最小値 510(最も小さい測定値)
Maximum 最大値 525(最も大きい測定値)

これらの統計値を使って、CloudWatchは自動的に平均値(Average = Sum / SampleCount)などの統計情報を計算できます。

データ集約によるAPI呼び出し削減のメリット

StatisticSetを使用すると、以下のメリットがあります。

  1. API呼び出し数の大幅削減: 12回の個別送信が1回の送信で済む
  2. コスト削減: API呼び出し料金が1/12に削減
  3. レート制限の回避: API呼び出しの上限に達しにくくなる
  4. ネットワーク効率: 送信するHTTPリクエスト数が減少

例えば、100個のECSタスクがそれぞれ1分間に12回メトリクスを送信する場合、従来は1分あたり1,200回のAPI呼び出しでしたが、StatisticSetを使えば100回(各タスク1回)に削減できます。

3. StatisticSetの使用例(ECSタスク)

ECSタスクで複数のメトリクスを集約するユースケース

ECSタスクで動作するアプリケーションが、リクエストごとに処理時間を測定し、1分間に集約してCloudWatchに送信するシナリオを考えます。このケースでは、1分間に60個のリクエストがあった場合、従来は60回のAPI呼び出しが必要でしたが、StatisticSetを使えば1回で済みます。

image.png
図1: 通常送信(個別送信)

image.png
図2: StatisticSet送信(集約送信)

image.png
図3: 100タスクでのAPI呼び出し数比較

AWS CLI / SDKでの実装例

AWS CLIでの実装

# StatisticSetを使用した集約送信(1回のAPI呼び出し)
aws cloudwatch put-metric-data \
  --namespace "MyApp/ECS" \
  --metric-name "RequestLatency" \
  --dimensions TaskId=task-abc123,ClusterName=my-cluster \
  --statistic-values Sum=15.5,SampleCount=60,Minimum=0.1,Maximum=0.5 \
  --unit Seconds \
  --timestamp 2025-11-15T10:01:00Z \
  --region ap-northeast-1

この例では、60個のリクエストの処理時間(合計15.5秒、最小0.1秒、最大0.5秒)を1回のAPI呼び出しで送信しています。

Python (Boto3) での実装例

ECSタスク内で実行するPythonスクリプトの例です。

import boto3
import time
from datetime import datetime

# CloudWatchクライアントの初期化
cloudwatch = boto3.client('cloudwatch', region_name='ap-northeast-1')

# メトリクスデータを収集
latencies = []

# リクエスト処理ループ(簡略化)
for _ in range(60):
    start = time.time()
    # ここでリクエスト処理
    # process_request()
    latency = time.time() - start
    latencies.append(latency)

# StatisticSetとして集約
if latencies:
    response = cloudwatch.put_metric_data(
        Namespace='MyApp/ECS',
        MetricData=[
            {
                'MetricName': 'RequestLatency',
                'Dimensions': [
                    {'Name': 'TaskId', 'Value': 'task-abc123'},
                    {'Name': 'ClusterName', 'Value': 'my-cluster'}
                ],
                'StatisticValues': {
                    'SampleCount': len(latencies),
                    'Sum': sum(latencies),
                    'Minimum': min(latencies),
                    'Maximum': max(latencies)
                },
                'Unit': 'Seconds',
                'Timestamp': datetime.utcnow()
            }
        ]
    )
    print(f"Metrics sent successfully: {response}")

通常送信とStatisticSet送信のAPI呼び出し数比較

以下の表で、1時間あたりのAPI呼び出し数を比較します。

送信方式 タスク数 1タスクあたりの測定回数/分 1時間のAPI呼び出し数 月間API呼び出し数(概算)
個別送信(Value) 100 60 360,000 約2億5,920万
StatisticSet送信 100 60(集約) 6,000 約432万
削減率 - - 98.3%削減 98.3%削減

この例では、StatisticSetを使用することで、API呼び出し数を60分の1に削減できます。

4. StatisticSetの制約事項と注意点

パーセンタイル統計が取得できない条件

AWS公式ドキュメント ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html ) によると、StatisticSetを使用した場合、パーセンタイル統計(p50, p90, p99など)を取得するには以下のいずれかの条件を満たす必要があります。

  1. SampleCountが1である
  2. MinimumとMaximumとSumがすべて等しい

つまり、複数のデータポイントを集約したStatisticSetからは、通常、パーセンタイル統計を取得できません。パーセンタイル統計が必要な場合は、ValuesCountsパラメータを使用する方法があります。

# ValuesとCountsを使用(最大150個の値を送信可能)
aws cloudwatch put-metric-data \
  --namespace "MyApp/ECS" \
  --metric-name "RequestLatency" \
  --values 0.1 0.15 0.2 0.25 0.3 \
  --counts 10 15 20 10 5 \
  --unit Seconds \
  --region ap-northeast-1

この方法では、1回のPutMetricDataで最大150個の一意の値を送信でき、パーセンタイル統計も取得可能です。

ValueとStatisticValuesの排他性

AWS公式ドキュメント ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricData.html ) では、『ValueとStatisticValuesは同時に指定できません』と明記されています。1つのMetricDatumには、以下のいずれか1つのみを指定する必要があります。

  • Value: 単一の値
  • StatisticValues: 統計セット(Sum, SampleCount, Minimum, Maximum)
  • ValuesCounts: 値の配列とその出現回数

データ圧縮率とのトレードオフ

StatisticSetは効率的ですが、元のデータポイントの詳細情報は失われます。例えば、60個のリクエスト処理時間を集約すると、個々のリクエストの処理時間は分からなくなります。

以下のような場合は、StatisticSetが適さない可能性があります。

  • 個々のデータポイントの詳細な分析が必要
  • 異常値の特定が重要
  • パーセンタイル統計(p50, p90など)の取得が必須

このような場合は、ValuesCountsを使用するか、個別にデータポイントを送信することを検討してください。

5. 料金比較と削減効果

カスタムメトリクス料金体系(2025年11月時点の東京リージョン料金)

2025年11月時点のap-northeast-1(東京リージョン)におけるCloudWatch料金は以下の通りです。

項目 料金
カスタムメトリクス 月額0.30 USD/メトリクス
API呼び出し(PutMetricData) 0.01 USD/1,000リクエスト
GetMetricStatistics API 最初の100万リクエストまで無料

注意: 料金は変動する可能性があります。最新の料金情報は AWS CloudWatch 料金ページ ( https://aws.amazon.com/jp/cloudwatch/pricing/ ) でご確認ください。

API呼び出し削減による料金削減例

100個のECSタスクが1分ごとにメトリクスを送信する場合の月間コストを比較します(メトリクス自体の料金は除く、API呼び出し料金のみ)。

個別送信(Value使用)の場合

  • 1分あたりAPI呼び出し: 100回
  • 1時間あたり: 6,000回
  • 1日あたり: 144,000回
  • 月間(30日): 4,320,000回
  • 月間API呼び出し料金: 43.20 USD

StatisticSet送信の場合

  • 1分あたりAPI呼び出し: 100回(各タスクが1分間のデータを集約して送信)
  • 1時間あたり: 6,000回
  • 1日あたり: 144,000回
  • 月間(30日): 4,320,000回

待ってください、このシナリオでは削減効果がありません。より効果的なのは、各タスクが複数の測定値を1分間に集約するケースです。

改訂版: 1分間に60個のデータポイントを送信する場合

個別送信の場合:

  • 100タスク × 60回/分 = 6,000回/分
  • 月間: 6,000 × 60 × 24 × 30 = 259,200,000回
  • 月間API呼び出し料金: 2,592.00 USD

StatisticSet送信の場合:

  • 100タスク × 1回/分(60個を集約) = 100回/分
  • 月間: 100 × 60 × 24 × 30 = 4,320,000回
  • 月間API呼び出し料金: 43.20 USD

削減額: 2,548.80 USD/月(98.3%削減)

このように、データポイントを集約してStatisticSetで送信することで、大幅なコスト削減が可能です。

6. 終わりに

CloudWatchのStatisticSetは、大量のメトリクスデータを効率的に送信するための強力な機能です。特に、ECSタスクやLambda関数など、多数のコンピュートリソースから頻繁にメトリクスを送信する場合、API呼び出し数を大幅に削減でき、コスト削減につながります。

実装のポイント

  1. 適切な集約単位を選択: 1分、5分など、ユースケースに応じた集約単位を決定
  2. パーセンタイル統計の必要性を確認: 必要な場合はValuesとCountsを使用
  3. メトリクスの重要度を考慮: 詳細な分析が必要な重要メトリクスは個別送信も検討

次のステップ

  • ECSタスクのモニタリングスクリプトにStatisticSet送信を実装
  • CloudWatch Dashboardで集約メトリクスを可視化
  • CloudWatch Alarmsで統計値(Average、Maximum)に基づくアラート設定
  • コスト削減効果を継続的にモニタリング

StatisticSetを活用して、効率的なCloudWatchモニタリング環境を構築しましょう。

7. 参考文献・参考サイト

AWS公式ドキュメント

技術記事・参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?