mcpField
A
aws-cloudformation-cloudwatch

aws-cloudformation-cloudwatch

github.com/giuseppe-trisciuoglioクラウド・DevOps36565 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-cloudwatch について

AWS CloudFormation で CloudWatch 監視を構築する開発者や運用担当者向けのスキルです。メトリクス、アラーム、ダッシュボード、ログに加え、異常検出や複合アラームも扱います。

主な機能

  1. 01メトリクスアラームと複合アラーム
  2. 02ダッシュボードとマルチリージョン表示
  3. 03ロググループの保持期間と暗号化
  4. 04ログメトリクスフィルター
  5. 05異常検出とメトリクス数式

活用シーン

  1. 01本番インフラ向け CloudWatch アラームを作成
  2. 02複数リソースを横断するダッシュボードを構築
  3. 03ログからカスタムメトリクスを生成
  4. 04暗号化ログと保持期間を設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill aws-cloudformation-cloudwatch

インストール後、Claude Code で/aws-cloudformation-cloudwatchを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
alarms.md
constraints.md
dashboards.md
examples.md
logs.md
reference.md

詳細

AWS CloudFormation CloudWatch の監視

概要

CloudFormation テンプレートを使用して、メトリクス、アラーム、ダッシュボード、ロググループ、異常検出、合成 canary、Application Signals などの CloudWatch 監視インフラストラクチャを作成します。

使用する場面

  • 本番環境のインフラストラクチャ向けに CloudWatch メトリクスとアラームを作成する
  • 複数リージョンを可視化する CloudWatch ダッシュボードを構築する
  • 保持期間、暗号化、メトリクスフィルターを設定したロググループを実装する
  • 異常検出と複合アラームを設定する
  • Parameters と Outputs を使用してスタック間参照を設定する
  • CloudFormation で監視スタックを検証してデプロイする

手順

以下の手順に従って、CloudFormation で CloudWatch 監視インフラストラクチャを作成します。

1. アラームのパラメーターを定義する

メトリクスの名前空間、ディメンション、しきい値を指定します。

Parameters:
  ErrorRateThreshold:
    Type: Number
    Default: 5
    Description: Error rate threshold for alarms (percentage)

  LatencyThreshold:
    Type: Number
    Default: 1000
    Description: Latency threshold in milliseconds

  CpuUtilizationThreshold:
    Type: Number
    Default: 80
    Description: CPU utilization threshold (percentage)

  LogRetentionDays:
    Type: Number
    Default: 30
    AllowedValues:
      - 1
      - 3
      - 7
      - 14
      - 30
      - 60
      - 90
      - 120
      - 365
    Description: Number of days to retain log events
2. CloudWatch アラームを作成する

CPU、メモリ、ディスク、カスタムメトリクス向けのアラームを設定します。

Resources:
  HighCpuAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-high-cpu"
      AlarmDescription: Trigger when CPU utilization exceeds threshold
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Dimensions:
        - Name: InstanceId
          Value: !Ref InstanceId
      Statistic: Average
      Period: 60
      EvaluationPeriods: 3
      Threshold: !Ref CpuUtilizationThreshold
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Ref AlarmTopic

  ErrorRateAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-error-rate"
      MetricName: ErrorRate
      Namespace: !Ref CustomNamespace
      Dimensions:
        - Name: Service
          Value: !Ref ServiceName
      Statistic: Average
      Period: 60
      EvaluationPeriods: 5
      Threshold: !Ref ErrorRateThreshold
      ComparisonOperator: GreaterThanThreshold
3. アラームアクションを設定する

通知を配信するための SNS トピックを定義します。

Resources:
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub "${AWS::StackName}-alarms"
      TopicName: !Sub "${AWS::StackName}-alarms"

  AlarmTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudwatch.amazonaws.com
            Action: sns:Publish
            Resource: !Ref AlarmNotificationTopic
      Topics:
        - !Ref AlarmNotificationTopic
4. ダッシュボードを作成する

リソース全体のメトリクスを可視化するウィジェットを構築します。

Resources:
  MonitoringDashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: !Sub "${AWS::StackName}-dashboard"
      DashboardBody: !Sub |
        {
          "widgets": [
            {
              "type": "metric",
              "x": 0,
              "y": 0,
              "width": 12,
              "height": 6,
              "properties": {
                "title": "CPU Utilization",
                "metrics": [["AWS/EC2", "CPUUtilization", "InstanceId", "${InstanceId}"]],
                "period": 300,
                "stat": "Average",
                "region": "${AWS::Region}"
              }
            }
          ]
        }
5. ロググループを設定する

保持ポリシーと暗号化設定を構成します。

Resources:
  ApplicationLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/applications/${Environment}/${ApplicationName}"
      RetentionInDays: !Ref LogRetentionDays
      KmsKeyId: !Ref LogEncryptionKey
6. メトリクスフィルターを実装する

ログデータからメトリクスを作成します。

Resources:
  ErrorMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref ApplicationLogGroup
      FilterPattern: '[level="ERROR", msg]'
      MetricTransformations:
        - MetricValue: "1"
          MetricNamespace: !Sub "${AWS::StackName}/Application"
          MetricName: ErrorCount
7. 複合アラームを追加する

複数の条件を組み合わせたアラームロジックを構築します。

Resources:
  SystemHealthComposite:
    Type: AWS::CloudWatch::CompositeAlarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-system-health"
      AlarmRule: !Or
        - !Ref HighCpuAlarm
        - !Ref ErrorRateAlarm
      AlarmActions:
        - !Ref AlarmTopic
8. Log Insights クエリを設定する

ログ分析用の保存済みクエリを作成します。

Resources:
  ErrorAnalysisQuery:
    Type: AWS::Logs::QueryDefinition
    Properties:
      Name: !Sub "${AWS::StackName}-errors"
      LogGroupNames:
        - !Ref ApplicationLogGroup
      QueryString: |
        fields @timestamp, @message
        | filter @message like /ERROR/
        | sort @timestamp desc
        | limit 100
9. テンプレートを検証する

デプロイする前に、CloudFormation テンプレートを検証します。

aws cloudformation validate-template --template-body file://template.yaml

パラメーター化されたテンプレートの場合は、サンプル値を使ってテストします。

aws cloudformation validate-template \
  --template-body file://monitoring.yaml \
  --capabilities CAPABILITY_IAM
10. デプロイして確認する

スタックをデプロイし、リソースを確認します。

# Deploy stack
aws cloudformation create-stack \
  --stack-name my-monitoring-stack \
  --template-body file://monitoring.yaml \
  --parameters file://parameters.json \
  --capabilities CAPABILITY_IAM

# Wait for completion
aws cloudformation wait stack-create-complete \
  --stack-name my-monitoring-stack

# Verify alarms are in OK state
aws cloudwatch describe-alarms --stack-name my-monitoring-stack

# Check dashboard accessibility
aws cloudwatch get-dashboard --dashboard-name my-monitoring-stack-dashboard

本番環境に移行する前に、アラームアクションをテストします。

# Set alarm to testing state
aws cloudwatch set-alarm-state \
  --alarm-name my-alarm \
  --state-value ALARM \
  --state-reason "Testing alarm action"

ベストプラクティス

  • 複合アラームを使用してノイズを減らし、誤検知を避けます
  • ベースラインメトリクスに基づいて、適切なしきい値を設定します
  • 適切な評価期間(データポイント 3~5 個)を設定します
  • 変動パターンのあるメトリクスでは、異常検出を有効にします
  • 派生メトリクス(エラー率、レイテンシのパーセンタイル)には、メトリクス数式を使用します
  • コンプライアンス要件に応じて、適切なログ保持期間を設定します
  • 機密データを含むロググループは、KMS で暗号化します
  • 本番環境に移行する前に、set-alarm-state でアラームアクションをテストします

例

例 1:完全な監視スタック
AWSTemplateFormatVersion: '2010-09-09'
Description: Complete CloudWatch monitoring setup

Parameters:
  Environment:
    Type: String
    Default: prod
    AllowedValues: [dev, staging, prod]

Resources:
  # SNS Topic for notifications
  AlarmTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub "${Environment}-alarms"

  # Alarm for high CPU
  CpuAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-cpu-high"
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: 300
      EvaluationPeriods: 2
      Threshold: 80
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Ref AlarmTopic

  # Dashboard
  Dashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: !Ref AWS::StackName
      DashboardBody: !Sub |
        {
          "widgets": [{
            "type": "metric",
            "properties": {
              "metrics": [["AWS/EC2", "CPUUtilization"]],
              "period": 300,
              "stat": "Average"
            }
          }]
        }
例 2:フィルターを使ったログベースのメトリクス
Resources:
  AppLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/app/${Environment}"
      RetentionInDays: 30

  ErrorMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref AppLogGroup
      FilterPattern: '"ERROR"'
      MetricTransformations:
        - MetricValue: "1"
          MetricNamespace: !Sub "${AWS::StackName}/App"
          MetricName: ErrorCount

  ErrorAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-errors"
      MetricName: ErrorCount
      MetricNamespace: !Sub "${AWS::StackName}/App"
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 1
      ComparisonOperator: GreaterThanOrEqualToThreshold

制約と警告

リソースの制限
  • アカウントあたりのアラーム数は最大 5000 個です
  • ロググループあたりのメトリクスフィルター数は最大 50 個です
  • ダッシュボード本文のサイズは 512KB までです
  • アラーム式あたりのメトリクス数は最大 200 個です
セキュリティに関する考慮事項
  • 機密データを含むロググループでは、暗号化を有効にします
  • IAM ポリシーを使用して、アラームアクションの権限を制限します
  • テンプレートにしきい値をハードコードせず、Parameters を使用します
  • SNS トピックを暗号化し、アクセスポリシーで保護します
運用上の警告
  • 高解像度アラーム(10 秒/30 秒)はコストが高くなります
  • 欠損データの扱いはアラーム状態に影響するため、明示的に設定します
  • 複合アラームによって個々のアラーム状態が見えにくくなることがあります
  • メトリクスフィルターは作成後に変更できません。変更するには作り直してください
コストの最適化
  • 必要がない限り、標準解像度(5 分間隔)を使用します
  • 適切な保持期間を設定します(短いほど低コストです)
  • 使用していないダッシュボードとカスタムメトリクスを削除します
  • 予算とアラートを使って CloudWatch の料金を監視します
監視戦略
  • 複合アラームを使用してアラームのノイズを減らします
  • 誤検知を避けるため、適切な評価期間を設定します
  • 変動パターンのあるメトリクスには、異常検出を設定します
  • 派生メトリクス(エラー率、平均値)には、メトリクス数式を使用します
  • 重要なメトリクスには、高解像度アラームを実装します
  • 対象者(運用、開発、管理)ごとにダッシュボードを分けて作成します
ログ管理
  • コンプライアンス要件に基づいて適切な保持期間を設定します
  • 機密データを含むロググループを暗号化します
  • 重要なログパターンに対するメトリクスフィルターを実装します
  • 一元的な分析のために、クロスアカウントのログ集約を設定します
  • トラブルシューティングには CloudWatch Logs Insights を使用します
  • リアルタイム処理のために、Lambda/Kinesis へのログサブスクリプションを設定します
アラームの設定
  • ベースラインメトリクスに基づいて、意味のあるしきい値を設定します
  • 信頼性を高めるために、アラームに必要なデータポイント数を使用します
  • 通知をリセットする OK アクションを設定します
  • 欠落データを適切に扱います(違反として扱う、違反として扱わない、無視する)
  • アラームアクションを定期的にテストします
  • アラームの運用手順書とエスカレーション手順を文書化します
テンプレートの構成
  • リソースには AWS 固有のパラメータータイプを使用します
  • 検証用のパラメーター制約を実装します
  • 環境固有の設定には Conditions を使用します
  • リージョン固有の設定には Mappings を活用します
  • パラメーターをグループ化するには Metadata を適用します
  • 大規模なモニタリング設定にはネストされたスタックを使用します
ダッシュボードの設計
  • サービスまたはアプリケーション層ごとにダッシュボードを整理します
  • ウィジェットのレイアウトとサイズを統一します
  • コンテキストとドキュメント用のテキストウィジェットを含めます
  • データの可視化に適した時間範囲を設定します
  • 動的なダッシュボードのフィルタリングには変数を使用します
  • パフォーマンスの問題を避けるため、ダッシュボードあたりのメトリクス数を制限します

参考資料

詳しい実装方法については、以下を参照してください。

  • alarms.md - ベースメトリクスアラーム、レイテンシーアラーム、API Gateway エラー、EC2 インスタンスアラーム、Lambda 関数アラーム、複合アラーム、異常検出、メトリクス数式、アラームアクション(SNS、Auto Scaling、EC2)、欠落データの扱い、カスタムメトリクス、メトリクスフィルター、高解像度アラームなど、CloudWatch のメトリクスとアラーム

  • dashboards.md - ベーステンプレート、サービス固有のダッシュボード、ウィジェットタイプ(メトリクス、ログ、テキスト、単一値、アラームステータス)、マルチリージョンダッシュボード、積み上げメトリクス、異常検出ウィジェット、数式、レイアウトパターン(グリッド、行、列)、動的変数、クロスアカウント共有、ダッシュボードの自動化など、CloudWatch ダッシュボード

  • logs.md - ロググループ設定、メトリクスフィルター、サブスクリプションフィルター(Lambda、Kinesis Firehose)、クロスアカウントのログ集約、Logs Insights クエリ、リソースポリシー、エクスポートとアーカイブのタスク、CloudWatch エージェントの設定、KMS によるログ暗号化、ライフサイクル管理、一元化されたログ記録、検索パターンなど、CloudWatch のログ

  • constraints.md - リソース制限(アラームは最大 5000 個、ダッシュボードは最大 500 個)、運用上の制約(メトリクスの解像度、評価期間、ダッシュボードウィジェット、クロスアカウント)、セキュリティ上の制約(ログデータへのアクセス、暗号化、メトリクスフィルター、アラームアクション)、コストに関する考慮事項(詳細モニタリング、カスタムメトリクス、ログ保持、ダッシュボードクエリ)、データの制約(メトリクスの経過時間、ログの取り込み、フィルターの上限)

関連リソース

コメント