关于 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 模板创建 CloudWatch 监控基础设施:指标、警报、控制面板、日志组、异常检测、合成 Canary 和 Application Signals。
适用场景
- 为生产基础设施创建 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 主题
操作警告
- 高分辨率警报(10s/30s)会产生更高费用
- 缺失数据处理方式会影响警报状态;请明确配置
- 复合警报可能会掩盖单个警报的状态
- 指标筛选器创建后不可更改;如需修改,请重新创建
成本优化
- 除非必要,否则使用标准分辨率(5 分钟周期)
- 设置适当的保留期(越短越便宜)
- 删除未使用的控制面板和自定义指标
- 使用预算和警报监控 CloudWatch 费用
监控策略
- 使用复合警报减少警报噪声
- 配置适当的评估周期以避免误报
- 为模式多变的指标设置异常检测
- 使用指标数学计算派生指标(错误率、平均值)
- 为关键指标实现高分辨率警报
- 为不同受众(运维、开发、管理)创建单独的控制面板
日志管理
- 根据合规要求设置适当的保留期限
- 对包含敏感数据的日志组进行加密
- 为关键日志模式实施指标筛选器
- 设置跨账户日志聚合,以便集中分析
- 使用 CloudWatch Logs Insights 进行故障排查
- 配置日志订阅,将日志发送到 Lambda/Kinesis 进行实时处理
告警配置
- 根据基线指标设置有意义的阈值
- 使用 datapoints-to-alarm 提高可靠性
- 配置 OK 操作以重置通知
- 妥善处理缺失数据(视为超限、视为未超限或忽略)
- 定期测试告警操作
- 编写告警运行手册和升级流程文档
模板结构
- 对资源使用 AWS 专用参数类型
- 实施参数约束以进行验证
- 使用 Conditions 进行特定于环境的配置
- 利用 Mappings 设置特定于区域的配置
- 使用 Metadata 对参数进行分组
- 对大型监控配置使用嵌套堆栈
控制面板设计
- 按服务或应用层级组织控制面板
- 使用一致的小组件布局和尺寸
- 添加文本小组件以提供上下文和文档
- 为数据可视化设置适当的时间范围
- 使用变量动态筛选控制面板
- 限制每个控制面板中的指标数量,以避免性能问题
参考资料
如需详细的实施指南,请参阅:
-
alarms.md - CloudWatch 指标和告警,包括基础指标告警、延迟告警、API Gateway 错误、EC2 实例告警、Lambda 函数告警、复合告警、异常检测、指标数学、告警操作(SNS、Auto Scaling、EC2)、缺失数据处理、自定义指标、指标筛选器和高分辨率告警
-
dashboards.md - CloudWatch 控制面板,包括基础模板、特定于服务的控制面板、小组件类型(指标、日志、文本、单值、告警状态)、多区域控制面板、堆叠指标、异常检测小组件、数学表达式、布局模式(网格、行、列)、动态变量、跨账户共享和控制面板自动化
-
logs.md - CloudWatch 日志,包括日志组配置、指标筛选器、订阅筛选器(Lambda、Kinesis Firehose)、跨账户日志聚合、Logs Insights 查询、资源策略、导出和归档任务、CloudWatch Agent 配置、使用 KMS 加密日志、生命周期管理、集中式日志记录和搜索模式
-
constraints.md - 资源限制(最多 5000 个告警、最多 500 个控制面板)、运维限制(指标分辨率、评估周期、控制面板小组件、跨账户)、安全限制(日志数据访问、加密、指标筛选器、告警操作)、成本注意事项(详细监控、自定义指标、日志保留、控制面板查询)和数据限制(指标时效、日志摄取、筛选器限制)