我创建了 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:Decrypt 和 kms: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