aws-cloudformation-cloudwatch について
AWS CloudFormation で CloudWatch 監視を構築する開発者や運用担当者向けのスキルです。メトリクス、アラーム、ダッシュボード、ログに加え、異常検出や複合アラームも扱います。
主な機能
- 01メトリクスアラームと複合アラーム
- 02ダッシュボードとマルチリージョン表示
- 03ロググループの保持期間と暗号化
- 04ログメトリクスフィルター
- 05異常検出とメトリクス数式
活用シーン
- 01本番インフラ向け CloudWatch アラームを作成
- 02複数リソースを横断するダッシュボードを構築
- 03ログからカスタムメトリクスを生成
- 04暗号化ログと保持期間を設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-cloudwatchインストール後、Claude Code で/aws-cloudformation-cloudwatchを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/alarms.mdconstraints.mddashboards.mdexamples.mdlogs.mdreference.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 個)、運用上の制約(メトリクスの解像度、評価期間、ダッシュボードウィジェット、クロスアカウント)、セキュリティ上の制約(ログデータへのアクセス、暗号化、メトリクスフィルター、アラームアクション)、コストに関する考慮事項(詳細モニタリング、カスタムメトリクス、ログ保持、ダッシュボードクエリ)、データの制約(メトリクスの経過時間、ログの取り込み、フィルターの上限)