我配置了一个 Amazon CloudWatch 警报,以便在警报状态发生变化时向 Amazon Simple Notification Service (Amazon SNS) 主题发送通知。但是,我没有收到通知。
解决方法
要确定未收到 SNS 通知的原因,请检查 CloudWatch 警报的历史记录以查看触发操作状态。
SNS 访问策略限制
之所以发生以下错误,是因为 SNS 访问策略未授予 CloudWatch 向 SNS 主题发布内容的权限。
"Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: CloudWatch Alarms is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"
要授予 CloudWatch 向 SNS 主题发布消息的权限,请在 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"
}
注意: 将 us-east-1 替换为通知所针对的 AWS 区域,将 ACCOUNT_ID 替换为您的 AWS 账户 ID,将 TOPIC_NAME 替换为 SNS 主题名称。
要限制可以向该主题发布消息的特定警报,请添加全局条件键。以下策略示例使用 ArnLike 条件运算符和 aws:SourceArn 全局条件键:
{ "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"
}
}
}
注意: 将 us-east-1 替换为通知所针对的区域,将 ACCOUNT_ID 替换为您的账户 ID,将 TOPIC_NAME 替换为 SNS 主题名称,将 ALARM_NAME 替换为警报名称。
只有在条件中指定的账户中的警报才能发布到 SNS 主题。例如,警报资源所有者的账户 ID 可以发布到主题。aws:SourceArn 条件限制在指定账户中发布警报。确认拥有 SNS 主题的账户和拥有警报的账户是同一个账户。
有关更多信息,请参阅 Amazon SNS 访问控制的示例案例。
SNS 主题加密问题
如果触发操作因 SNS 主题加密而失败,则 CloudWatch 警报历史记录将显示以下错误:
"Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: CloudWatch Alarms does not have authorization to access the SNS topic encryption key."
如果您将 Amazon SNS 配置为使用默认 AWS Key Management Service (AWS KMS) alias/aws/sns 密钥进行服务器端加密,则 CloudWatch 无法发布到 SNS 主题。Amazon SNS 的默认 AWS KMS 密钥策略不允许 CloudWatch 执行 kms:Decrypt 和 kms:GenerateDataKey API 操作。由于 AWS 管理此密钥,因此您无法手动编辑该策略。
如果必须对 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"
如果您没有收到 SNS 通知,请检查 SNS 主题及其指标是否存在传输失败的情况。有关详细信息,请参阅如何访问推送通知的 Amazon SNS 主题传输日志?
注意: CloudWatch 不会测试或验证您指定的操作。CloudWatch 也不会检测到当您尝试调用不存在的操作时出现的 Amazon EC2 Auto Scaling 或 Amazon SNS 错误。确认您的操作存在。
相关信息
使用 Amazon CloudWatch 警报
Encrypting messages published to Amazon SNS with AWS KMS(使用 AWS KMS 加密发布到 Amazon SNS 的消息)