📊 CloudWatch カスタムメトリクス
& PutMetricData 完全ガイド

病院の健康診断で理解する!IAMアクションの仕組みと設定方法

🔑 IAMアクション 📈 カスタムメトリクス ☁️ CloudWatch

🏥 病院の健康診断で例えると超わかりやすい!

CloudWatchは「病院の健康診断センター」のようなもの!

AWSの標準メトリクス = 基本的な健康診断(身長・体重・血圧)
カスタムメトリクス = あなた独自の検査項目 (コレステロール値、肝機能など)

でも検査結果を送るには 「許可証」 が必要ですよね?
その許可証が cloudwatch:PutMetricData という IAMアクション です!✨

🩺 病院のたとえ話で完全理解!

🏥

CloudWatch
= 健康診断センター

🎯 役割:
病院には「健康診断センター」がありますよね。
ここにすべての検査結果が集まり、医師が確認できます。
☁️ AWSでは:
CloudWatchがまさにこれ!
CPU使用率やメモリ使用量など、あらゆる「健康状態」を監視・記録する場所です。
📝

カスタムメトリクス
= 独自の検査項目

🎯 役割:
基本健診以外にも「腫瘍マーカー」「アレルギー検査」など
オプションで追加できる検査がありますよね。
☁️ AWSでは:
カスタムメトリクスがこれ!
「ログイン回数」「カート追加数」「API応答時間」など
あなたのビジネスに特化した数値 を送れます。
🔑

PutMetricData
= 検査結果提出の許可証

🎯 役割:
検査結果を健康診断センターに提出するには
「この人は検査結果を提出していいよ」という許可証が必要です。
☁️ AWSでは:
cloudwatch:PutMetricData というIAMアクションがこれ!
この権限がないと、メトリクスを送信できません。
👨‍⚕️

IAMポリシー
= 院内規則書

🎯 役割:
「誰が」「どの検査室に」「どんな検査結果を」提出できるか
を定めた院内規則書です。
☁️ AWSでは:
IAMポリシーがまさにこれ!
「このEC2インスタンスは」「CloudWatchに」「メトリクスを送信できる」
という 許可ルール を定義します。

📚 3つの重要概念をマスター!

📊

標準メトリクス

AWSが 自動で収集 してくれる基本的な数値。

EC2なら「CPU使用率」「ネットワークI/O」など。
追加料金なし で利用可能!

🎨

カスタムメトリクス

あなたが 自分で送信 する独自の数値。

「アクティブユーザー数」「購入完了率」など
ビジネス指標 を監視できる!

🔐

PutMetricData

カスタムメトリクスを 送信する権限

このIAMアクションがないと
データを送れない! 必須の許可です。

🔄 カスタムメトリクス送信の流れ

💻
1. アプリケーション
EC2やLambdaで
独自の数値を計測
➡️
🔑
2. IAM権限チェック
PutMetricData
の許可を確認
➡️
📤
3. API呼び出し
CloudWatch APIに
メトリクスを送信
➡️
📊
4. CloudWatch
データを保存
グラフ化・アラーム設定
⚠️ 権限がないとどうなる?
AccessDenied エラー が発生してメトリクスを送信できません!
「検査結果を提出しようとしたら、受付で門前払いされた」状態です。

エラーメッセージ例:
User: arn:aws:iam::123456789012:user/myuser is not authorized to perform: cloudwatch:PutMetricData

🔐 PutMetricData IAMアクション詳解

📋

アクション名

cloudwatch:PutMetricData

CloudWatchサービスの「メトリクスデータを送信(Put)する」アクションです。
このアクションを許可しないと、カスタムメトリクスは一切送信できません。

🌍

リソース指定

リソースレベルの制限はできません (Resource: "*" のみ)

これは「どの名前空間にでも送信できる」という意味です。
ただし、送信できるかどうかは Action の許可/拒否 で制御します。

🏷️

条件キー(Condition)での制限

cloudwatch:namespace 条件キーで 名前空間を制限 できます!

例:「MyApp/Production」名前空間にのみ送信を許可
これで他のチームのメトリクスに誤って上書きすることを防げます。

📝 基本的なIAMポリシー(最小権限)
// カスタムメトリクス送信に必要な最小限のポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        }
    ]
}
🔒 名前空間を制限した安全なポリシー(推奨)
// 特定の名前空間にのみ送信を許可(ベストプラクティス)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "MyApp/Production"
                }
            }
        }
    ]
}

// 複数の名前空間を許可する場合
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "cloudwatch:namespace": "MyApp/*"
                }
            }
        }
    ]
}

📋 CloudWatch メトリクス関連のIAMアクション一覧

IAMアクション 説明 カスタムメトリクス送信に
cloudwatch:PutMetricData メトリクスデータを送信する 必須 🔑
cloudwatch:GetMetricData メトリクスデータを取得する 任意(閲覧用)
cloudwatch:GetMetricStatistics メトリクス統計を取得する 任意(分析用)
cloudwatch:ListMetrics 利用可能なメトリクスを一覧表示 任意(確認用)
cloudwatch:PutMetricAlarm アラームを作成・更新する 任意(アラーム設定用)
💡 最小権限の原則
カスタムメトリクスを送信するだけなら cloudwatch:PutMetricData のみでOK!

他のアクションは「メトリクスを見たい」「アラームを設定したい」など
追加の要件がある場合にのみ付与しましょう。
不要な権限は付与しない のがセキュリティのベストプラクティスです。

💼 実際のユースケース

🛒

ECサイト

監視したい指標:
• カート追加数
• 購入完了率
• 商品閲覧数
• 決済処理時間
名前空間例:
MyECShop/Sales
MyECShop/Performance
🎮

ゲームアプリ

監視したい指標:
• 同時接続プレイヤー数
• マッチング待ち時間
• ガチャ実行回数
• 課金イベント数
名前空間例:
MyGame/Players
MyGame/Monetization
📱

SaaSアプリケーション

監視したい指標:
• アクティブユーザー数
• API呼び出し回数
• 機能利用率
• エラー発生率
名前空間例:
MySaaS/Usage
MySaaS/Health
🏭

IoT・製造業

監視したい指標:
• センサー温度
• 機械稼働率
• 製品不良率
• エネルギー消費量
名前空間例:
Factory/Sensors
Factory/Production
🐍 Python (boto3) でカスタムメトリクスを送信する例
# pip install boto3
import boto3
from datetime import datetime

# CloudWatchクライアントを作成
cloudwatch = boto3.client('cloudwatch')

# カスタムメトリクスを送信
response = cloudwatch.put_metric_data(
    Namespace='MyApp/Production',  # 名前空間(必須)
    MetricData=[
        {
            'MetricName': 'ActiveUsers',      # メトリクス名
            'Value': 150,                       # 値
            'Unit': 'Count',                    # 単位
            'Timestamp': datetime.utcnow(),    # タイムスタンプ
            'Dimensions': [                     # ディメンション(任意)
                {
                    'Name': 'Environment',
                    'Value': 'Production'
                },
            ],
        },
    ]
)

print('メトリクス送信成功!')
💻 AWS CLI でカスタムメトリクスを送信する例
# 単一のメトリクスを送信
aws cloudwatch put-metric-data \
    --namespace "MyApp/Production" \
    --metric-name "ActiveUsers" \
    --value 150 \
    --unit "Count"

# ディメンション付きで送信
aws cloudwatch put-metric-data \
    --namespace "MyApp/Production" \
    --metric-name "ResponseTime" \
    --value 0.5 \
    --unit "Seconds" \
    --dimensions "Environment=Production,Service=API"

# JSONファイルから複数のメトリクスを送信
aws cloudwatch put-metric-data \
    --namespace "MyApp/Production" \
    --metric-data file://metrics.json
🏆 ベストプラクティス
1. 名前空間で制限をかける:
IAMポリシーの Condition で cloudwatch:namespace を指定し、送信先を限定しましょう。
「MyApp/*」のようなワイルドカードも使えます。
2. IAMロールを使う:
EC2やLambdaには IAMロール を割り当て、アクセスキーのハードコーディングを避けましょう。
セキュリティと管理性が大幅に向上します。
3. バッチ送信を活用:
put_metric_data は1回の呼び出しで最大1,000個のメトリクスを送信できます。
APIコールを減らしてコストと効率を最適化しましょう。
4. エラーハンドリング:
送信失敗時のリトライロジックを実装しましょう。
一時的なネットワーク障害でデータが欠落するのを防げます。
5. コストを意識:
カスタムメトリクスは課金対象です。送信頻度と保存期間を適切に設定し、
不要なメトリクスは削除しましょう。

🎓 まとめ

🏥 病院の健康診断 = CloudWatch

カスタムメトリクスを送信するには
「検査結果提出の許可証」 が必要です!

🔑
必須アクション

cloudwatch:
PutMetricData

🎯
役割

カスタムメトリクス
送信の許可

🔒
推奨設定

名前空間で
アクセスを制限

🎯 覚えておくべきこと:

カスタムメトリクス送信 = cloudwatch:PutMetricData が必須!
最小権限の原則を守り、 cloudwatch:namespace 条件で制限をかけよう!🎉

Created by SSuzuki1063

AWS SAP Learning Resources