概要
CloudWatchカスタムメトリクスは便利ですが、大量のデータポイントを送信するとAPI呼び出し料金がかさみます。StatisticSetを使えば、複数のデータポイントを集約して送信でき、API呼び出し数を大幅に削減できます。本記事では、ECSタスクを例にStatisticSetの実装方法と効率化のポイントを解説します。
目次
- CloudWatchカスタムメトリクスとPutMetricData APIの基本
- StatisticSetとは
- StatisticSetの使用例(ECSタスク)
- StatisticSetの制約事項と注意点
- 料金比較と削減効果
- 終わりに
- 参考文献・参考サイト
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を使用すると、以下のメリットがあります。
- API呼び出し数の大幅削減: 12回の個別送信が1回の送信で済む
- コスト削減: API呼び出し料金が1/12に削減
- レート制限の回避: API呼び出しの上限に達しにくくなる
- ネットワーク効率: 送信する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回で済みます。
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など)を取得するには以下のいずれかの条件を満たす必要があります。
- SampleCountが1である
- MinimumとMaximumとSumがすべて等しい
つまり、複数のデータポイントを集約したStatisticSetからは、通常、パーセンタイル統計を取得できません。パーセンタイル統計が必要な場合は、ValuesとCountsパラメータを使用する方法があります。
# 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) -
ValuesとCounts: 値の配列とその出現回数
データ圧縮率とのトレードオフ
StatisticSetは効率的ですが、元のデータポイントの詳細情報は失われます。例えば、60個のリクエスト処理時間を集約すると、個々のリクエストの処理時間は分からなくなります。
以下のような場合は、StatisticSetが適さない可能性があります。
- 個々のデータポイントの詳細な分析が必要
- 異常値の特定が重要
- パーセンタイル統計(p50, p90など)の取得が必須
このような場合は、ValuesとCountsを使用するか、個別にデータポイントを送信することを検討してください。
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分、5分など、ユースケースに応じた集約単位を決定
- パーセンタイル統計の必要性を確認: 必要な場合はValuesとCountsを使用
- メトリクスの重要度を考慮: 詳細な分析が必要な重要メトリクスは個別送信も検討
次のステップ
- ECSタスクのモニタリングスクリプトにStatisticSet送信を実装
- CloudWatch Dashboardで集約メトリクスを可視化
- CloudWatch Alarmsで統計値(Average、Maximum)に基づくアラート設定
- コスト削減効果を継続的にモニタリング
StatisticSetを活用して、効率的なCloudWatchモニタリング環境を構築しましょう。
7. 参考文献・参考サイト
AWS公式ドキュメント
- 「Publish custom metrics」AWS Documentation, https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html
- 「PutMetricData」AWS Documentation, https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricData.html
- 「put-metric-data」AWS CLI Command Reference, https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html
- 「AWS SDK または CLI で PutMetricData を使用する」AWS Documentation, https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/example_cloudwatch_PutMetricData_section.html
- 「Amazon CloudWatch 料金」AWS, https://aws.amazon.com/jp/cloudwatch/pricing/
技術記事・参考資料
- moomindani「CloudWatch Metricsの細かすぎて誰にも伝わらない話」Qiita, 2017年12月12日, https://qiita.com/moomindani/items/1eacbfe5b71b200a2da9
- 「Use API to retrieve data points from CloudWatch metrics」AWS re:Post, 2024年6月12日, https://repost.aws/knowledge-center/cloudwatch-getmetricdata-api


