跳至内容

为什么我没有收到 CloudWatch 警报触发器的 Amazon SNS 通知?

2 分钟阅读
0

我配置了一个 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 的消息)