【问题标题】:Cloudformation - S3 AWS event not being triggered?Cloudformation - 未触发 S3 AWS 事件?
【发布时间】:2021-03-08 12:28:24
【问题描述】:

我正在尝试创建一个 cloudformation 堆栈来监视 S3 存储桶(由不同的堆栈创建)并在上传/覆盖某个文件时启动 codebuild 运行。我的模板看起来像:

  NgBuildCodeBuild:
    Type: AWS::CodeBuild::Project
    ...
   
  AmazonCloudWatchEventRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: !Sub
            - 'myapp-frontend-built-${Branch}-watch-s3'
            - { Branch: !Ref TrackedBranch }
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: codebuild:StartBuild
                Resource: !GetAtt NgBuildCodeBuild.Arn

  AmazonCloudWatchEventRule:
    Type: AWS::Events::Rule
    Properties:
      EventPattern:
        source:
          - aws.s3
        detail-type:
          - 'AWS API Call via CloudTrail'
        detail:
          eventSource:
            - s3.amazonaws.com
          eventName:
            - PutObject
            - CompleteMultipartUpload
          requestParameters:
            bucketName:
              - 'my-app-src-s3-bucket'
            key:
              - !Sub
                - 'myGitUsername/myRepoName/${Branch}/src.zip'
                - { Branch: !Ref TrackedBranch }
      Targets:
        - Arn: !GetAtt NgBuildCodeBuild.Arn
          RoleArn: !GetAtt AmazonCloudWatchEventRole.Arn
          Id: codebuild-myapp-frontend

堆栈部署良好,但是当我将 src.zip 上传到正在监视的键/目标 ('myGitUsername/myRepoName/${Branch}) 时...什么也没有发生。我很确定我正在上传到正确的 S3 存储桶和路径。看起来该事件从未被触发。当我查看事件桥中已部署规则的指标时,没有数据。我期待这个 aws CLI 命令触发事件: aws s3 cp $outputbucketkey s3://$outputbucket/$outputbucketpath。删除src.zip 并使用网络浏览器重新上传也不会触发该事件。

我是否使用了错误的事件名称?还是我误解了事件桥的用途?

【问题讨论】:

  • eventName 中包含CopyObject?另外,请确保您指定的键匹配。
  • 您是否在 CloudTrial 试用版中启用了 S3 数据事件?
  • @Marcin 没有。那是问题谢谢。一旦我做到了,事件规则就开始被触发并开始构建。您能否展示如何在 cloudformation 中做到这一点?我在 Web 控制台中制作了 cloudtrail,但理想情况下它将成为此 cloudformation 模板的一部分。
  • 没问题。很高兴它有效。我根据 cmets 提供了一个答案。对于您的用例,我没有完整的 cloudtrial 示例。我建议您尝试自己创建它,如果遇到困难,请根据您的要求提出具有相关详细信息的新问题。

标签: amazon-s3 amazon-cloudformation aws-event-bridge


【解决方案1】:

基于 cmets。

问题是由 CloudTrial 中的缺少线索引起的。要记录 S3 put 事件,必须使用 data events for S3 创建跟踪。要在 CloudWatch 中启用试用,AWS::CloudTrail::TrailAWS::CloudTrail::Trail DataResource

【讨论】: