控制面板

示例:生产环境警报

将你关心的 CloudWatch 警报放在一个小组件中,正在触发的警报排在最前,并显示在主屏幕和锁定屏幕上。你可以手动创建它,也可以让 CloudFormation 或 Terraform 使它与你部署的警报保持同步。

更新于 2026年10月19日

你将创建的内容

你将创建一个名为 CloudPeek-Alarms 的 CloudWatch 控制面板,其中包含一个列出生产环境警报的警报状态小组件。处于 ALARM 状态的警报始终排在最前,因此你看到的正是需要你处理的那个。它在 CloudPeek 中的样子如下:

先显示警报中的,然后是数据不足的,最后是正常的。中号及更大的小组件会显示每个警报多久前发生了变化。

如果你的警报已经存在,大约需要五分钟。

想显示所有警报,又不想创建控制面板?在 CloudPeek 中,轻点创建小组件,选择预设,然后选择“日志和监控”下的警报或警报摘要。警报会按相同的顺序列出账户默认区域中的所有警报,你可以通过编辑为它重新命名,例如改为“生产环境警报”;警报摘要则统计警报数量,例如“2 个异常、20 个正常”。如果只想显示名称以相同文本开头(例如 prod-)的警报,请在预览中的显示下选择名称开头为…(请参阅仅显示部分)。如果添加了多个账户,可以在预览中选择所有账户,以涵盖每个账户以及你勾选的区域,每个账户一行,例如“prod:2 个异常 · staging:全部正常”(请参阅所有账户中的警报)。如果要逐个挑选警报,或显示来自多个区域的警报,请按下文创建控制面板。

开始之前

  • 要监控的 CloudWatch 警报:同一账户任何区域中的指标警报或复合警报。
  • CloudPeek 的访问权限。入门中的 CloudPeek 策略已包含警报小组件所需的 cloudwatch:DescribeAlarms。如果你已完成该设置,就可以开始了。
  • 可以创建 CloudWatch 控制面板的登录身份,例如管理员。

费用。CloudWatch 免费套餐包含三个控制面板;超出部分每个控制面板每月 3 美元。警报小组件使用 DescribeAlarms 而不是 GetMetricData 刷新,因此不会增加指标费用:它按请求计费,而 CloudWatch 免费套餐涵盖每个账户每月的前一百万个请求。请参阅 CloudWatch 定价。

1. 创建控制面板

控制面板通过 ARN 列出警报,例如 arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors,其中包含警报的区域、账户和名称。

  1. 打开 CloudWatch › 警报 › 所有警报。对于每个需要的警报,打开它并从其详细信息中复制 ARN。
  2. 选择控制面板 › 创建控制面板。将其命名为 CloudPeek-Alarms,然后选择创建控制面板。如果打开了添加小部件窗口,请将其关闭。
  3. 选择操作 › 查看/编辑源,将源替换为下面的控制面板 JSON(用你的 ARN 替换示例 ARN),然后选择更新。
  4. 选择保存。

你也可以选择添加小部件 › 警报状态并勾选警报,而不是编辑源。然后在源中添加 "sortBy": "stateUpdatedTimestamp",使最近发生变化的警报排在最前。

列出名称以 prod- 开头的所有警报的 ARN:

Shell
aws cloudwatch describe-alarms \
  --region us-east-1 \
  --alarm-name-prefix prod- \
  --query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
  --output json

将它们放入 production-alarms.json(见下文)以替换示例,然后运行:

Shell
aws cloudwatch put-dashboard \
  --region us-east-1 \
  --dashboard-name CloudPeek-Alarms \
  --dashboard-body file://production-alarms.json

或者使用 jq,一步根据这些警报创建控制面板:

Shell
aws cloudwatch describe-alarms \
  --region us-east-1 \
  --alarm-name-prefix prod- \
  --query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
  --output json |
jq '{widgets: [{type: "alarm", x: 0, y: 0, width: 12, height: 6,
  properties: {title: "Production alarms", sortBy: "stateUpdatedTimestamp", alarms: .}}]}' \
  > production-alarms.json

aws cloudwatch put-dashboard \
  --region us-east-1 \
  --dashboard-name CloudPeek-Alarms \
  --dashboard-body file://production-alarms.json

每次添加警报后,请再次运行。

如果你的警报在同一个模板中,请在 !Sub 中用 ${Alarm.Arn} 列出它们,这样控制面板始终与你部署的警报一致:

CloudFormation
  AlarmsDashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: CloudPeek-Alarms
      DashboardBody: !Sub |
        {
          "widgets": [
            {
              "type": "alarm", "x": 0, "y": 0, "width": 12, "height": 6,
              "properties": {
                "title": "Production alarms",
                "sortBy": "stateUpdatedTimestamp",
                "alarms": [
                  "${ApiErrorsAlarm.Arn}",
                  "${QueueDepthAlarm.Arn}"
                ]
              }
            }
          ]
        }

这里的 ApiErrorsAlarm 和 QueueDepthAlarm 是同一模板中的 AWS::CloudWatch::Alarm 资源。对于在其他地方定义的警报,请使用它们的 ARN 部署 cloudpeek-alarms.yaml:

cloudpeek-alarms.yaml(资源)下载
Resources:
  # sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
  # ALARM first. The ARNs are joined into a JSON array of strings.
  Dashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: !Ref DashboardName
      DashboardBody: !Sub
        - |
          {
            "widgets": [
              {
                "type": "alarm",
                "x": 0,
                "y": 0,
                "width": 12,
                "height": 6,
                "properties": {
                  "title": "${WidgetTitle}",
                  "sortBy": "stateUpdatedTimestamp",
                  "alarms": [ "${Alarms}" ]
                }
              }
            ]
          }
        - Alarms: !Join ['", "', !Ref AlarmArns]
Shell
aws cloudformation deploy \
  --stack-name CloudPeek-Alarms \
  --template-file cloudpeek-alarms.yaml \
  --parameter-overrides 'AlarmArns=arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors,arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth'

如果你的警报在同一个配置中,请列出它们的 arn 属性,这样控制面板始终与你应用的警报一致:

Terraform
resource "aws_cloudwatch_dashboard" "alarms" {
  dashboard_name = "CloudPeek-Alarms"
  dashboard_body = jsonencode({
    widgets = [{
      type = "alarm", x = 0, y = 0, width = 12, height = 6
      properties = {
        title  = "Production alarms"
        sortBy = "stateUpdatedTimestamp"
        alarms = [
          aws_cloudwatch_metric_alarm.api_5xx.arn,
          aws_cloudwatch_metric_alarm.queue_depth.arn,
        ]
      }
    }]
  })
}

这里的 api_5xx 和 queue_depth 是同一配置中的 aws_cloudwatch_metric_alarm 资源。如果你使用 for_each 创建警报,请用 [for alarm in aws_cloudwatch_metric_alarm.prod : alarm.arn] 列出全部警报。对于在其他地方定义的警报,请使用它们的 ARN 应用 cloudpeek-alarms.tf:

cloudpeek-alarms.tf(控制面板)下载
variable "alarm_arns" {
  description = "The ARNs of the alarms to list. Each ARN names its own region, so one widget can list alarms from several regions."
  type        = list(string)

  validation {
    condition     = length(var.alarm_arns) > 0
    error_message = "List at least one alarm ARN."
  }
}

# sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
# ALARM first.
resource "aws_cloudwatch_dashboard" "alarms" {
  dashboard_name = var.dashboard_name
  dashboard_body = jsonencode({
    widgets = [
      {
        type   = "alarm"
        x      = 0
        y      = 0
        width  = 12
        height = 6
        properties = {
          title  = var.widget_title
          sortBy = "stateUpdatedTimestamp"
          alarms = var.alarm_arns
        }
      },
    ]
  })
}
terraform.tfvars
alarm_arns = [
  "arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
  "arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
]
Shell
terraform init
terraform apply

2. 添加账户并固定小组件

  1. 打开 CloudPeek,在账户标签页上使用访问密钥或 IAM Identity Center 添加包含你的警报的账户。请参阅入门的第 2 步。
  2. 在账户标签页上,打开该账户,再打开 CloudPeek-Alarms 控制面板,然后轻点 Production alarms 上的固定。
  3. 将 CloudPeek 添加到主屏幕(请参阅主屏幕和锁定屏幕)。它最初显示你最后固定的小组件 Production alarms。中号会显示每个警报上次变化的时间;小号适合快速查看数量。
  4. 轻点小组件,即可查看每个警报、CloudWatch 给出的状态原因以及该状态的开始时间,还可以在 AWS 控制台中打开其中任何一个。在中号或大号小组件上,轻点某个警报可直接跳转到该屏幕中的这个警报。

结果:小组件会列出你的警报,处于警报状态的排在最前。在 iPhone 和 iPad 的锁定屏幕上,它会显示摘要,例如“1 个警报中”或“全部正常”。

控制面板详解

无论使用哪种工具,最终的控制面板都如下所示,只是其中是你自己的警报 ARN:

production-alarms.json下载
{
  "widgets": [
    {
      "type": "alarm",
      "x": 0,
      "y": 0,
      "width": 12,
      "height": 6,
      "properties": {
        "title": "Production alarms",
        "sortBy": "stateUpdatedTimestamp",
        "alarms": [
          "arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
          "arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
          "arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-high-cpu"
        ]
      }
    }
  ]
}
  • alarm 小组件通过 ARN 列出警报,数量不限。
  • "sortBy": "stateUpdatedTimestamp" 会在每种状态内将最近发生变化的警报排在最前,在 CloudPeek 和 CloudWatch 控制台中均是如此。
  • 每个 ARN 都包含其区域,CloudPeek 会在各自的区域中查找每个警报,因此一个小组件可以列出来自多个区域的警报。

警报的排列顺序

  • 在 CloudPeek 中,处于 ALARM 状态的警报始终排在最前,然后是数据不足的警报,接着是找不到的警报,最后是正常的警报。如果警报多到显示不下,显示的将是需要你处理的那些。
  • 如果没有 sortBy,控制台会按名称排列警报,而 CloudPeek 会保持它们的列出顺序,但处于 ALARM 状态的警报仍排在最前。
  • 小号小组件显示摘要和前三四个警报。中号及更大的小组件会尽量多地显示,大号小组件约可显示十几个,每个警报都会注明其状态在多久前发生变化。其余的会计为还有 N 项。
  • 小号小组件和锁定屏幕上的摘要会以红色显示 N 个警报中;所有警报都正常时以绿色显示全部正常;所有警报都还没有足够数据时显示无数据;部分警报没有数据或找不到时显示 N 个未知。
  • 每个警报的符号表示其状态:请参阅警报列表。

在警报触发时收到通知

当警报小组件中的某个警报进入 ALARM 状态时,CloudPeek 可以发送通知,注明警报名称并给出 CloudWatch 提供的原因,例如“Threshold Crossed: 1 datapoint [12.0] was greater than the threshold (10.0).”。这适用于任何警报小组件:从控制面板固定的警报小组件(如 Production alarms),或警报和警报摘要预设,包括涵盖所有账户的预设,其中任何账户的警报开始触发时都会通知(请参阅所有账户中的警报)。

  1. 在小组件标签页上,轻点 Production alarms 以打开它的专属屏幕。
  2. 开启警报列表下方的警报触发时通知。
  3. 首次开启时,手机会询问是否允许 CloudPeek 向你发送通知(在 Android 上,从 Android 13 开始):轻点允许。

结果:开关已开启。当某次刷新发现小组件的某个警报处于警报状态,而上次刷新时并非如此,你会收到一条通知,例如“prod-api-5xx-errors 处于警报状态”。轻点通知即可打开该小组件的屏幕,其中显示每个警报的原因,以及指向 AWS 控制台中每个警报的链接。

通知来自小组件的刷新:由显示它的主屏幕小组件(包括列出它的概览小组件;在 iPhone 和 iPad 上还包括锁定屏幕小组件)刷新,或在 App 中刷新。请按照第 2 步将小组件保留在主屏幕上,否则只有在你打开 CloudPeek 时它才会刷新。

不能替代值班呼叫。通知来自小组件的刷新,因此速度取决于小组件的刷新频率:在 iPhone 和 iPad 上,间隔通常为数十分钟,在低电量模式下或你很少查看小组件时间隔更长;在 Android 上最多每 15 分钟一次,手机省电时间隔更长(请参阅小组件何时刷新)。打开 App 也会刷新小组件。对于需要在几分钟内有人处理的警报,请继续通过 Amazon SNS 或你的值班工具进行呼叫。

  • 每个警报每次进入警报状态时只通知一次,无论有多少次刷新或多少个小组件发现它。开启通知时已处于警报状态的警报,会在下次触发时通知。从正常变为数据不足的警报并未触发,因此不会通知。
  • 同时开始触发的警报不超过三个时,每个警报各发一条通知。超过三个时,会合并为一条列出所有警报名称的通知,例如“4 个警报处于警报状态”。
  • 如果某个警报与小组件列出的另一个警报同名,通知会注明其区域;跨账户时,如果需要靠 AWS 账户 ID 来区分,还会注明账户 ID,例如“api-5xx (us-east-1, 222222222222) 处于警报状态”。
  • 通知是在你的手机或平板电脑上根据小组件获取的数据生成的。不会向 CloudPeek 或推送服务发送任何内容,也不需要小组件尚未拥有的任何 AWS 权限。
  • 移除小组件会关闭其通知,撤销则会重新开启。
  • 如果在手机的“设置”中关闭了 CloudPeek 的通知,小组件的屏幕会显示“CloudPeek 的通知已关闭。在‘设置’中允许通知后即可收到通知。”在 iPhone 和 iPad 上,轻点打开设置,开启允许通知,然后返回 CloudPeek。在 Android 上,点按打开设置,这会打开 CloudPeek 的通知设置,开启通知后返回即可。

故障排除

警报显示为虚线圆圈

CloudPeek 找不到该警报。请检查 ARN 中的名称、区域和账户是否与警报完全一致:警报名称区分大小写。CloudPeek 会在你固定该小组件时所在的账户中查找警报,因此无法找到其他 AWS 账户中的警报;请将该警报放到那个账户的控制面板上,并将那个账户添加到 CloudPeek。

警报显示为问号

它还没有足够的数据供 CloudWatch 评估,与控制台中的情况相同。它会排在处于 ALARM 状态的警报之后。

CloudPeek 提示访问被拒绝

该登录身份需要 cloudwatch:DescribeAlarms。CloudPeek 策略和 AWS 托管的 CloudWatchReadOnlyAccess 策略中都包含该权限。

收不到通知

请检查该小组件是否已开启警报触发时通知,它的屏幕上是否没有显示通知已关闭,以及该小组件是否在你的主屏幕上(在 iPhone 和 iPad 上也可以是锁定屏幕),通知正是由这些小组件的刷新发出的。通知的频率取决于小组件的刷新频率,已处于警报状态的警报会在下次触发时通知。请参阅在警报触发时收到通知。

控制台中的顺序不同

如果没有 "sortBy": "stateUpdatedTimestamp",CloudWatch 控制台会按名称排列警报。将它添加到小组件的属性中,即可与 CloudPeek 一致。

其他问题

请参阅故障排除,或发送电子邮件至 support@cloudpeek.app。切勿向我们发送你的秘密访问密钥。