You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何EventBridge无法向默认权限SNS主题发消息而CloudWatch可以?

问题与解答

背景信息

某SNS主题配置了如下默认访问策略:

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish"
      ],
      "Resource": "arn:aws:sns:us-east-1:############:NotificationTopic-test",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "############"
        }
      }
    }
  ]
}

问题

CloudWatch告警可向该主题发送消息,但EventBridge规则无法发送。请问:EventBridge是否需要在SNS访问策略中指定Principal为{"Service": "events.amazonaws.com"},而CloudWatch不需要?若是,原因是什么?

回答

是的,EventBridge需要单独在SNS访问策略中指定Principal: {"Service": "events.amazonaws.com"},而CloudWatch告警不需要,核心原因在于两者调用SNS时的身份验证逻辑差异:

  • CloudWatch告警调用SNS的Publish接口时,是以你的AWS账户身份发起请求,请求携带的AWS:SourceOwner会匹配策略中配置的账户ID,因此能通过默认策略的Condition校验,顺利发送消息。
  • EventBridge规则调用SNS时,是以EventBridge服务自身的身份发起请求,此时请求的AWS:SourceOwner属于EventBridge服务所属的AWS账户,无法匹配你的账户ID,自然过不了默认策略的Condition校验。必须在SNS策略中单独添加一条允许events.amazonaws.com服务主体调用SNS:Publish的语句,才能让EventBridge成功推送消息到该主题。

示例补充策略语句:

{
  "Sid": "AllowEventBridgePublish",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "arn:aws:sns:us-east-1:############:NotificationTopic-test"
}

内容的提问来源于stack exchange,提问作者himmel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:33:11