无法通过 CFT 在 CodeBuild 项目上成功设置 SNS,但手动工作

Posted

技术标签:

【中文标题】无法通过 CFT 在 CodeBuild 项目上成功设置 SNS,但手动工作【英文标题】:Unable to successfully set up SNS on CodeBuild project through CFT but works manually 【发布时间】:2020-09-30 04:17:51 【问题描述】:

我正在尝试设置一个 SNS 系统,以便在构建失败时发送电子邮件。目前,我只是将它设置为在达到几个不同阶段时发送通知以进行测试。

我已经按照 AWS 的教程学习了很多次,以至于我已经记住了整个过程,但是当我将它翻译成 CFT 时,有些东西不起作用。

创建所有内容后,我会收到确认电子邮件,但之后在我的 CodeBuild 项目中单击“开始构建”按钮时,我不会再收到任何有关构建状态的电子邮件。 如果我手动执行此操作,我将收到所有预期的电子邮件。

sns-build-notifications.yml

###
### Stack Name: sns-build-notifications
###
### Template Name: sns-build-notifications.yml
###
### Description: Creates a notification system that emails users when a
###              specified build fails
###

AWSTemplateFormatVersion : '2010-09-09'

Globals:
  Api:
    OpenApiVersion: 3.0.1

Transform: AWS::Serverless-2016-10-31

Resources:
  rSnsTopicDemo:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: rSnsTopicDemo
      Subscription:
        - Protocol: email
          Endpoint: myEmail@gmail.com

  rCloudWatchEventRuleDemo:
    Type: AWS::Events::Rule
    Properties:
      Description: Delete when finished
      EventPattern:
        source:
          - aws.codebuild
        detail-type:
          - CodeBuild Build State Change
        detail:
          build-status:
            - IN_PROGRESS
            - SUCCEEDED
            - FAILED
            - STOPPED
          project-name:
            - CodeBuildStateChangeDemo
      Targets:
        - Arn: !Ref rSnsTopicDemo
          Id: CodeBuildStateChangeDemo
          InputTransformer:
              InputPathsMap:
                build-status: "$.detail.build-status"
              InputTemplate: |
                "Build has entered status: '<build-status>'"

我附上了一些通过 CFT 创建的资源图片。 出于安全考虑,某些名称可能与我在此处描述的名称不同。

CodeBuildStateChangeDemo

rSnsTopicDemo

rSnsTopicDemo 订阅

CloudWatch 事件规则

【问题讨论】:

【参考方案1】:

根据您发布的内容,我看到 没有 AWS::SNS::TopicPolicy 允许 CW 事件向其提交任何消息。

主题政策需要在 CFN 中显式创建。控制台在后台执行此操作。示例策略如下:


  "Sid": "AWSEvents_kkk_Id983908485049",
  "Effect": "Allow",
  "Principal": 
    "Service": "events.amazonaws.com"
  ,
  "Action": "sns:Publish",
  "Resource": "<my-sns-topic-arn>"

【讨论】:

好的,我先试试这个,谢谢你的建议。我确实注意到的一件事是,如果我将上面的两个资源分成两个单独的 CFT 并在不同的时间运行它们(首先是主题/子,然后是 CW 事件),一切都很好。这些知识会改变你的答案吗?这没有您建议的 TopicPolicy。 @BrandonBenefield 有趣。我不确定那将如何工作。您可以在控制台中查看 sns 策略。您可以比较通过控制台手动设置所有内容时的策略是什么,以及通过一两个 CFT 完成的策略有何不同。 正如你所说,我错过了 TopicPolicy 资源。谢谢您的帮助。请注意,此答案中的 JSON 实际上是 TopicPolicy 的 Properties 部分。您仍然需要包含 Marcin 共享的链接中显示的其余资源。

以上是关于无法通过 CFT 在 CodeBuild 项目上成功设置 SNS,但手动工作的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer 无法在 AWS CodeBuild 上运行 Chrome

CodeBuild 与 Amazon Virtual Private Cloud 结合使用

无法将更改从 AWS CodeBuild 推送到 AWS CodeCommit

从另一个帐户访问 Codebuild 项目

使用 AWS CDK 创建用于构建 Docker 映像的 CodeBuild 项目

AWS CodeBuild 本地缓存无法实际缓存?