为什么在 CloudWatch 警报触发时,我没有收到 SNS 通知?

2 分钟阅读
0

我创建了 Amazon CloudWatch 警报,以便在警报状态更改时通过 Amazon Simple Notification Service(Amazon SNS)主题发送通知。但是,在 CloudWatch 警报状态更改时,我没有收到 SNS 通知。

解决方法

SNS 通知的传输取决于 SNS 主题和 CloudWatch 警报的配置。要确定为什么您没有收到 SNS 通知,检查 CloudWatch 警报的历史记录以查看触发操作的状态。

如果您的触发操作由于 SNS 访问策略限制而失败,则 CloudWatch 警报历史记录会显示一条类似以下内容的消息:

“Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "Resource: arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME”(执行 arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME 操作失败。收到错误:“资源:arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME 无权执行:SNS:发布到资源:arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME”)”

SNS 会对可以使用访问策略将消息发布到主题的源进行限制。如果发生权限错误,您必须将以下权限添加到 SNS 访问策略 Statement(语句)部分的下方。此更新将赋予 CloudWatch 警报服务将消息发布到 SNS 主题的权限。

**注意:**将 us-east-1 替换为此通知适用的 AWS 区域。将 ACCOUNT_ID 替换为您的账户 ID。将 TOPIC_NAME 替换为 SNS 主题名称:

{
  "Sid": "Allow_Publish_Alarms",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "cloudwatch.amazonaws.com"
    ]
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"
}

这些权限允许使用您账户的任何人创建警报并向您的 SNS 主题发布消息。要将向主题发布消息的能力限制为特定警报,请添加全局条件键。以下示例使用 ArnLike 条件运算符和 aws:SourceArn 全局条件键。有关更多信息,请参阅 Amazon SNS 访问控制的示例案例

**注意:****注意:**将 us-east-1 替换为此通知适用的 AWS 区域。将 ACCOUNT_ID 替换为您的账户 ID。将 TOPIC_NAME 替换为 SNS 主题名称。将 ALARM_NAME 替换为警报名称:

{
  "Sid": "Allow_Publish_Alarms",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "cloudwatch.amazonaws.com"
    ]
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:REGION:ACCOUNT_ID:TOPIC_NAME",
  "Condition": {
    "ArnLike": {
      "aws:SourceArn": "arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME"
    }
  }
}

如果您的触发器操作由于 SNS 主题加密而失败,则 CloudWatch 警报历史记录会显示一条类似以下内容的消息:

“Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException;)""(执行 arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME 操作失败。收到错误:“null(服务:AWSKMS;状态码:400;错误代码:AccessDeniedException;))

SNS 将允许对其主题进行静态加密。如果 SNS 将默认的 AWS Key Management Service(AWS KMS)密钥 alias/aws/sns 用于此加密,CloudWatch 警报将无法发布消息到 SNS 主题。适用于 SNS 的默认 AWS KMS 密钥的策略不允许 CloudWatch 警报执行 kms:Decryptkms:GenerateDataKey API 调用。因为此密钥由 AWS 托管,您无法手动编辑该策略。

如果必须对 SNS 主题进行静态加密,请使用客户托管密钥。客户托管密钥必须包含密钥策略 Statement(语句)部分下方的以下权限。这些权限允许 CloudWatch 告警将消息发布到已加密的 SNS 主题:

{
  "Sid": "Allow_CloudWatch_for_CMK",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "cloudwatch.amazonaws.com"
    ]
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey*"
  ],
  "Resource": "*"
}

如果您的触发器操作成功,则 CloudWatch 警报历史记录会显示一条类似以下内容的消息:

Successfully executed action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"(“执行 arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME 操作成功”)

这说明 CloudWatch 告警成功地将消息发布到 SNS 主题。如果该通知未通过 SNS 传输,请检查 SNS 主题及其指标以了解任何传输失败的原因。有关更多信息,请参阅如何访问 Amazon SNS 主题传输日志以查看推送通知?

**注意:**CloudWatch 不会测试或验证由您指定的操作。它也不会检测因为尝试调用不存在的操作而导致的 Amazon EC2 Auto Scaling 或 Amazon SNS 错误。确保您的操作存在。


相关信息

使用 Amazon CloudWatch 告警

使用 AWS KMS 将加密消息发布到 Amazon SNS

相关视频

AWS 官方
AWS 官方已更新 1 年前