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

上次更新日期:2021 年 8 月 27 日

我创建了 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: : : .Received error: "Resource: arn:aws:cloudwatch: : :alarm: is not authorized to perform: SNS:Publish on resource: arn:aws:sns: : :
  • SNS 会对可以使用访问策略将消息发布到主题的源进行限制。如果发生权限错误,以下权限必须被添加到 SNS 访问策略“语句”部分的下方。此更新将赋予 CloudWatch 告警服务将消息发布到 SNS 主题的权限。
    注意: 替换为此通知适用的区域。将 替换为您的账户 ID。将 替换为 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 主题发布消息。添加 全局条件键以将向主题发布消息的能力限制为特定警报。以下示例使用 arnLike 条件运算符和 aws:SourceArn 全局条件键。有关更多信息,请参阅 Amazon SNS 访问控制的示例案例

注意: 替换为此通知适用的区域。将 替换为您的账户 ID。将 替换为 SNS 主题名称。将 替换为告警名称。

{
    "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:<region>:<account-id>:alarm:<alarm-name>"
        }
    }
}

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

  • CloudWatch 告警历史记录会显示类似以下内容的消息:
    Failed to execute action arn:aws:sns: : : .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 主题进行静态加密,您可以使用客户托管密钥。客户托管密钥必须包含密钥策略“语句”部分下方的以下权限。这些权限允许 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: : :
  • 这说明 CloudWatch 告警成功地将消息发布到 SNS 主题。如果该通知未通过 SNS 传输,检查 SNS 主题及其指标以了解任何传输失败的原因。有关更多信息,请参阅如何访问 Amazon SNS 主题传输日志以查看推送通知?

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?