

# 将警报更改通知用户
<a name="Notify_Users_Alarm_Changes"></a>

本节说明了如何使用 AWS User Notifications 或 Amazon Simple Notification Service，来让用户收到有关警报更改的通知。

## 设置 AWS User Notifications
<a name="Alarm_User_Notifications"></a>

您可以使用 [AWS User Notifications](https://docs.aws.amazon.com/notifications/latest/userguide/what-is-service.html) 来设置传输渠道，以用于接收有关 CloudWatch 警报状态更改和配置更改事件的通知。当事件与指定的规则匹配时，会收到通知。您可以通过多个渠道接收事件通知，包括电子邮件、[AWS Chatbot](https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html) 聊天通知或 [AWS 控制台移动应用程序推送通知](https://docs.aws.amazon.com/consolemobileapp/latest/userguide/managing-notifications.html)。您还可以在 [控制台通知中心](https://console.aws.amazon.com/notifications) 中查看通知。用户通知支持聚合，这可以减少在具体事件期间收到的通知数量。

您使用 AWS User Notifications 创建的通知配置不会计入您可以为每个目标警报状态配置的操作数量限制。当 AWS 用户通知服务对发送给 Amazon EventBridge 的事件进行匹配时，除非您指定高级筛选条件来将特定的警报或模式列入允许列表或拒绝列表，否则会针对您账户和选定区域中的所有警报发送通知。

以下高级筛选条件示例将对名为 `ServerCpuTooHigh` 的警报从“正常”变为“警报”的警报状态更改进行匹配。

```
{
"detail": {
    "alarmName": ["ServerCpuTooHigh"],
    "previousState": { "value": ["OK"] },
    "state": { "value": ["ALARM"] }
  }
}
```

您可以使用警报在 EventBridge 事件中发布的任何属性来创建筛选条件。有关更多信息，请参阅 [告警事件和 EventBridge](cloudwatch-and-eventbridge.md)。

## 设置 Amazon SNS 通知
<a name="US_SetupSNS"></a>

您可以使用 Amazon Simple Notification Service 来发送应用程序到应用程序（A2A）消息和应用程序对人（A2P）消息，包括手机短信（SMS）和电子邮件。有关更多信息，请参阅 [Amazon SNS 事件目标](https://docs.aws.amazon.com/sns/latest/dg/sns-event-destinations.html)。

对于警报可能处于的每种状态，您都可以将警报配置为向某个 SNS 主题发送消息。您为给定警报状态配置的每个 Amazon SNS 主题，都将计入您可以为该警报和状态配置的操作数量限制。您可以从账户中的任何警报向同一 Amazon SNS 主题发送消息，并为应用程序（A2A）和个人（A2P）消费端使用相同的 Amazon SNS 主题。由于此配置是在警报级别进行的，因此只有您配置的警报才会向所选的 Amazon SNS 主题发送消息。

首先，创建一个主题，然后订阅此主题。您可以选择将测试消息发布到此主题。有关示例，请参阅[使用 AWS 管理控制台 设置 Amazon SNS 主题](#set-up-sns-topic-console)。有关更多信息，请参阅 [Amazon SNS 入门](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)。

或者，如果您计划使用 AWS 管理控制台来创建 CloudWatch 警报，则可跳过此过程，因为您可在创建警报时创建主题。

 创建 CloudWatch 警报时，您可以为任何警报目标状态添加操作。为您想要收到通知的状态添加 Amazon SNS 通知，然后选择您在上一步中创建的 Amazon SNS 主题，从而在警报进入选定状态时发送电子邮件通知。

**注意**  
在创建 Amazon SNS 主题时，您可以选择将其设为*标准主题*或 *FIFO 主题*。CloudWatch 定会将所有告警通知发布到这两种类型的主题。但是，即使您使用 FIFO 主题，在极少数情况下，CloudWatch 也会不按顺序将通知发送到该主题。如果您使用 FIFO 主题，告警会将告警通知的消息组 ID 设置为告警的 ARN 的哈希值。

**Topics**
+ [防止混淆代理安全问题](#SNS_Confused_Deputy)
+ [使用 AWS 管理控制台 设置 Amazon SNS 主题](#set-up-sns-topic-console)
+ [使用 AWS CLI 设置 SNS 主题](#set-up-sns-topic-cli)

### 防止混淆代理安全问题
<a name="SNS_Confused_Deputy"></a>

混淆代理问题是一个安全性问题，即不具有某操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在 AWS 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。可以操纵调用服务，使用其权限以在其他情况下该服务不应有访问权限的方式对另一个客户的资源进行操作。为防止这种情况，AWS 提供可帮助您保护所有服务的数据的工具，而这些服务中的服务主体有权限访问账户中的资源。

建议在资源策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgid) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgpaths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgpaths) 全局条件上下文键，以限制 Amazon SNS 为其他服务提供的资源访问权限。使用 `aws:SourceArn` 来仅将一个资源与跨服务访问相关联。使用 `aws:SourceAccount` 来让该账户中的任何资源与跨服务使用相关联。使用 `aws:SourceOrgID` 来允许某组织内的任何账户中的任何资源与跨服务使用相关联。使用 `aws:SourceOrgPaths` 来将 AWS Organizations 路径内账户中的任何资源与跨服务使用相关联。有关使用和了解路径的更多信息，请参阅《IAM 用户指南》中的 [aws:SourceOrgPaths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceorgpaths)。

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符字符（`*`）的 `aws:SourceArn` 全局上下文条件键。例如 `arn:aws:servicename:*:123456789012:*`。

如果 `aws:SourceArn` 值不包含账户 ID，例如 Amazon S3 桶 ARN，您必须使用 `aws:SourceAccount` 和 `aws:SourceArn` 来限制权限。

要防范大规模混淆代理问题，请在基于资源的策略中将 `aws:SourceOrgID` 或 `aws:SourceOrgPaths` 全局条件上下文键与资源的组织 ID 或组织路径一起使用。包含 `aws:SourceOrgID` 或 `aws:SourceOrgPaths` 键的策略将自动包含正确的账户，并且当您在组织中添加、删除或移动账户时，无需手动更新策略。

`aws:SourceArn` 的值必须是发送通知的警报的 ARN。

以下示例演示如何在 CloudWatch 中使用 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

```
{
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudwatch.amazonaws.com"
        },
        "Action": "SNS:Publish",
        "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
        "Condition": {
            "ArnLike": {
                "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:*"
            },
            "StringEquals": {
                "aws:SourceAccount": "111122223333"
            }
        }
    }]
}
```

如果警报 ARN 包含任何非 ASCII 字符，请仅使用 `aws:SourceAccount` 全局条件键限制权限。

### 使用 AWS 管理控制台 设置 Amazon SNS 主题
<a name="set-up-sns-topic-console"></a>

首先，创建一个主题，然后订阅此主题。您可以选择将测试消息发布到此主题。

**创建 SNS 主题**

1. 通过 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 打开 Amazon SNS 控制台。

1. 在 Amazon SNS 控制面板上的 **Common actions（常用操作）**下，选择 **Create Topic（创建主题）**。

1. 在 **Create new topic（创建新主题）**对话框中，为 **Topic name（主题名称）**输入主题的名称（例如 **my-topic**）。

1. 选择 **Create topic（创建主题）**。

1. 复制下一个任务的 **Topic ARN（主题 ARN）**（例如 arn:aws:sns:us-east-1:111122223333:my-topic）。

**订阅 SNS 主题**

1. 通过 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 打开 Amazon SNS 控制台。

1. 在导航窗格中，依次选择 **Subscriptions（订阅）**、**Create subscription（创建订阅）**。

1. 在 **Create subscription（创建订阅）**对话框中，为 **Topic ARN（主题 ARN）**粘贴在上一任务中创建的主题 ARN。

1. 对于**协议**，选择**电子邮件**。

1. 对于 **Endpoint（端点）**，输入一个可用于接收通知的电子邮件地址，然后选择 **Create subscription（创建订阅）**。

1. 从您的电子邮件应用程序中，打开来自 AWS 通知的消息并确认您的订阅。

   您的 Web 浏览器将显示来自 Amazon SNS 的确认响应。

**向 SNS 主题发布测试消息**

1. 通过 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 打开 Amazon SNS 控制台。

1. 在导航窗格中，选择 **Topics（主题）**。

1. 在 **Topics（主题）**页面上，选择一个主题，然后选择 **Publish to topic（发布到主题）**。

1. 在 **Publish（发布消息）**页面中，为 **Subject（主题）**输入消息的主题行，并为 **Message（消息）**输入简短的消息。

1. 选择 **Publish Message（发布消息）**。

1. 查看电子邮件，确认您已收到消息。

### 使用 AWS CLI 设置 SNS 主题
<a name="set-up-sns-topic-cli"></a>

首先，您创建一个 SNS 主题，然后将一条消息直接发布到该主题，以测试您是否正确配置了该主题。

**设置 SNS 主题**

1. 使用 [create-topic](https://docs.aws.amazon.com/cli/latest/reference/sns/create-topic.html) 命令创建主题，如下所示。

   ```
   1. aws sns create-topic --name my-topic
   ```

   Amazon SNS 返回具有以下格式的主题 ARN：

   ```
   1. {
   2.     "TopicArn": "arn:aws:sns:us-east-1:111122223333:my-topic"
   3. }
   ```

1. 使用 [subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html) 命令以通过您的电子邮件地址订阅该主题。如果订阅请求成功，您将收到一封确认电子邮件。

   ```
   1. aws sns subscribe --topic-arn arn:aws:sns:us-east-1:111122223333:my-topic --protocol email --notification-endpoint my-email-address
   ```

   Amazon SNS 将返回以下内容：

   ```
   1. {
   2.     "SubscriptionArn": "pending confirmation"
   3. }
   ```

1. 从您的电子邮件应用程序中，打开来自 AWS 通知的消息并确认您的订阅。

   您的 Web 浏览器将显示来自 Amazon Simple Notification Service 的确认响应。

1. 使用 [list-subscriptions-by-topic](https://docs.aws.amazon.com/cli/latest/reference/sns/list-subscriptions-by-topic.html) 命令检查订阅。

   ```
   1. aws sns list-subscriptions-by-topic --topic-arn arn:aws:sns:us-east-1:111122223333:my-topic
   ```

   Amazon SNS 将返回以下内容：

   ```
    1. {
    2.   "Subscriptions": [
    3.     {
    4.         "Owner": "111122223333",
    5.         "Endpoint": "me@mycompany.com",
    6.         "Protocol": "email",
    7.         "TopicArn": "arn:aws:sns:us-east-1:111122223333:my-topic",
    8.         "SubscriptionArn": "arn:aws:sns:us-east-1:111122223333:my-topic:64886986-bf10-48fb-a2f1-dab033aa67a3"
    9.     }
   10.   ]
   11. }
   ```

1. （可选）使用 [publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html) 命令向主题发布测试消息。

   ```
   1. aws sns publish --message "Verification" --topic arn:aws:sns:us-east-1:111122223333:my-topic
   ```

   Amazon SNS 将返回以下内容。

   ```
   1. {
   2.     "MessageId": "42f189a0-3094-5cf6-8fd7-c2dde61a4d7d"
   3. }
   ```

1. 查看电子邮件，确认您已收到消息。

## 警报状态更改时的 Amazon SNS 通知架构
<a name="alarm-sns-schema"></a>

本节列举了警报状态更改时向 Amazon SNS 主题发送的通知的架构。

**指标警报状态更改时的架构**

```
{
  "AlarmName": "string",
  "AlarmDescription": "string",
  "AWSAccountId": "string",
  "AlarmConfigurationUpdatedTimestamp": "string",
  "NewStateValue": "string",
  "NewStateReason": "string",
  "StateChangeTime": "string",
  "Region": "string",
  "AlarmArn": "string",
  "OldStateValue": "string",
  "OKActions": ["string"],
  "AlarmActions": ["string"],
  "InsufficientDataActions": ["string"],
  "Trigger": {
    "MetricName": "string",
    "Namespace": "string",
    "StatisticType": "string",
    "Statistic": "string",
    "Unit": "string or null",
    "Dimensions": [
      {
        "value": "string",
        "name": "string"
      }
    ],
    "Period": "integer",
    "EvaluationPeriods": "integer",
    "DatapointsToAlarm": "integer",
    "ComparisonOperator": "string",
    "Threshold": "number",
    "TreatMissingData": "string",
    "EvaluateLowSampleCountPercentile": "string or null"
  }
}
```

**复合指标警报状态更改时的架构**

```
{
  "AlarmName": "string",
  "AlarmDescription": "string",
  "AWSAccountId": "string",
  "NewStateValue": "string",
  "NewStateReason": "string",
  "StateChangeTime": "string",
  "Region": "string",
  "AlarmArn": "string",
  "OKActions": [String],
  "AlarmActions": [String],
  "InsufficientDataActions": [String],
  "OldStateValue": "string",
  "AlarmRule": "string",
  "TriggeringChildren": [String]
}
```