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 模板创建 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 个控制面板)、运维限制(指标分辨率、评估周期、控制面板小组件、跨账户)、安全限制(日志数据访问、加密、指标筛选器、告警操作)、成本注意事项(详细监控、自定义指标、日志保留、控制面板查询)和数据限制(指标时效、日志摄取、筛选器限制)

相关资源

评论

支持 Markdown