尝试从代码管道发送通知时,SNS 通知目标规则“无法访问”

sum*_*tty 15 amazon-web-services amazon-sns aws-codepipeline

我正在尝试使用支持 SNS 的通知规则为代码管道设置通知。

在此输入图像描述

如图所示,状态为“无法访问”

如果我查看此处的链接aws 故障排除

我已经遵循了所有步骤,甚至在 SNS 主题的访问策略中添加 codestar-notifications 的步骤。

{
      "Sid": "AWSCodeStarNotifications_publish",
      "Effect": "Allow",
      "Principal": {
        "Service": "codestar-notifications.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:codestar-notifications:us-east-1:272075499248:notificationrule/50d629524d433dceeafdb6c5fe136e404f29e9e5"
    }
Run Code Online (Sandbox Code Playgroud)

但是,状态仍然保持不变,也尝试手动启动管道,但仍然不起作用。

我错过了什么吗?有人能帮我解决这个问题吗?

编辑:

 {
  "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",
        "SNS:Receive"
      ],
      "Resource": "arn:aws:sns:us-east-1:272075499248:develop",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "272075499248"
        }
      }
    },
    {
      "Sid": "AWSCodeStarNotifications_publish",
      "Effect": "Allow",
      "Principal": {
        "Service": "codestar-notifications.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:us-east-1:272075499248:develop"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Rap*_*tin 16

之前的答案太混乱了,其中一些不完整。这是完整的解决方案,包括来龙去脉。


1、简单通知服务访问策略混乱

每当您单独创建SNS 主题时,默认访问策略将如下所示:

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "arn:aws:sns:us-east-2:123456789012:my-sns-topic",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "123456789012"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

上面是错误的,不会让您的 CodePipeline 访问SNS 主题(使其可访问/“Active”)!将SNS 主题访问策略更改为以下内容:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "CodeNotification_publish",
      "Effect": "Allow",
      "Principal": {
        "Service": "codestar-notifications.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:us-east-2:123456789012:my-sns-topic"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

注意 1:更改123456789012为您的 AWS 账户 ID 和您的SNS 主题my-sns-topic的名称。注意 2:如果您所在的区域与 不同,请在上面的代码片段中进行更改。注意 3SNS 主题CodePipeline 通知规则都应该位于同一区域,否则将不起作用。
us-east-2

2.通知规则和通知规则目标问题

每当您创建通知规则,然后创建通知规则目标时,AWS 刷新通知目标状态的唯一方法就是您从中删除通知规则目标CodePipeline -> Settings (on the left side bar) -> Notification rules -> Notification rule targets(这非常重要!)。

注意:从通知规则本身中删除通知规则目标不会执行任何操作;因此,当您在该页面中重新添加它时,通知规则目标仍将是旧的,因此通知目标状态将保持“无法访问”。


如果完成所有操作后它仍然显示无法访问,请再次重复步骤 #1 和 #2,您可能错过了某些内容。

  • 谢谢,通过将“Service”:“codestar-notifications.amazonaws.com”添加到“Principal”并执行步骤2,它对我有用。 (2认同)
  • 很好的答案!你救了我的命。AWS 应更新默认访问策略片段。 (2认同)

小智 2

解决此问题的一种方法是使用 CodePipeline 用户界面来创建主题。这将为您设置所有必需的权限。创建通知规则时,在“目标”下,选择“创建目标”并输入您要创建的主题的名称。将使用已设置的权限创建主题。您只需订阅该主题即可接收通知。