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

上次更新时间:2020 年 2 月 5 日

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

解决方法

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

如果您的触发操作因为 SNS 访问策略限制而失败

  • CloudWatch 警报历史显示的消息类似于:Failed to execute action arn:aws:sns:<region>:<account-id>:<topic-name>.Received error: "Resource: arn:aws:cloudwatch:<region>:<account-id>:alarm:<alarm-name> is not authorized to perform: SNS:Publish on resource: arn:aws:sns:<region>:<account-id>:<topic-name>
  • SNS 会对可以使用访问策略将消息发布到主题的源进行限制。如果发生权限错误,以下权限必须被添加到 SNS 访问策略“语句”部分的下方。此更新将赋予 CloudWatch 警报服务将消息发布到 SNS 主题的权限。
    注: <region> 替换为会使用此通知的区域,将 <account-id> 替换为您的账户 ID,并将 <topic name> 替换为 SNS 主题名称。
{
    "Sid": "Allow_Publish_Alarms",
    "Effect": "Allow",
    "Principal":
    {
        "Service": [
            "cloudwatch.amazonaws.com"
        ]
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:<region>:<account-id>:<topic-name>"
}

如果您的触发操作因为 SNS 主题加密而失败

  • CloudWatch 警报历史显示的消息类似于:Failed to execute action arn:aws:sns:<region>:<account-id>:<topic-name>.Received error: "null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException;)"
  • SNS 将允许对其主题进行静态加密。若默认的 AWS Key Management Service (KMS) 密钥 "alias/aws/sns" 被用于此加密,CloudWatch 警报将无法发布消息到 SNS 主题。适用于 SNS 的默认 AWS KMS 密钥的密钥策略不会允许 CloudWatch 警报执行 "kms:Decrypt" 和 "kms:GenerateDataKey" API 调用。因为此密钥由 AWS 托管,您无法手动编辑该策略。
  • 如果必须对 SNS 主题进行静态加密,您可以使用客户托管 CMK。客户托管 CMK 必须包含密钥策略“语句”部分下方的以下权限。这些权限允许 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:<region>:<account-id>:<topic-name>
  • 这说明 CloudWatch 警报成功地将消息发布到 SNS 主题。如果该通知未通过 SNS 传输,检查 SNS 主题及其指标以了解任何传输失败的原因。如需更多信息,请见如何排查失败的 Amazon SNS 推送通知传输问题

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


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?