【问题标题】:Create an S3 bucket that sends notification to SNS topic创建向 SNS 主题发送通知的 S3 存储桶
【发布时间】:2022-01-15 09:55:27
【问题描述】:

我正在尝试创建一个 s3 存储桶,每次将对象放入 s3 存储桶时,它都会向 SNS 主题发送通知。我的 S3 存储桶名为 foo-bucket,我的 SNS 主题名为 foo-topic。我知道如何在 aws 控制台中进行设置,但是在尝试通过 cloudformation 进行设置时遇到了问题。

这是我目前拥有的代码

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: foo-topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
        - Sid: Statement-id
          Effect: Allow
          Principal:
            Service: s3.amazonaws.com
          Action: sns:Publish
          Resource:
            Ref: SNSTopic
          Condition:
            ArnLike:
              aws:SourceArn:
                Fn::Join:
                - ''
                - - 'arn:aws:s3:::'
                  - Ref: S3Bucket
      Topics:
      - Ref: SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: foo-bucket 
      AccessControl: BucketOwnerFullControl
      NotificationConfiguration:
        TopicConfigurations:
        - Topic:
            Ref: SNSTopic
          Event: s3:ObjectCreated:Put

由于以下错误,我尝试部署上述和cfn回滚

无法验证以下目标配置(服务: 亚马逊 S3;状态码:400;错误代码:无效参数;请求编号: 呜呜; S3 扩展请求 ID:foooid;代理:空)

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-sns


    【解决方案1】:

    是的,你的问题是依赖关系;)

    我遇到了同样的问题,如果你没有指定依赖顺序,比如先创建 SNS,然后在 Bucket 部分获取使用 REF 创建的 ID,你会遇到关于目标配置的问题。

    请点击此链接解决您的问题,您将看到DependsOn

    https://aws.amazon.com/premiumsupport/knowledge-center/unable-validate-destination-s3/?nc1=h_ls

    【讨论】:

    • 但看起来我正在以正确的 oder、snstopic、snstopicpolicy、s3bucket 创建薄。你能告诉我我究竟需要做什么来解决这个问题吗?
    • Yaml 中的 ressources 顺序之后没有创建顺序,我的意思是如果您将 SNS 先放在 yaml 中,然后将 S3 放在 yaml 中,CloudFormation 将尝试并行创建它们,因此您必须添加一个依赖必须工作,请参阅发布的链接。
    • @Unknowntiou,清楚吗?
    • @Hatim The DependsOn 并不总是足够的。创建 S3 通知,aws 检查是否有发送消息的权限。当策略配置中有 S3 引用时,根据依赖关系图,cf 首先尝试创建 S3,然后主题策略和 SNS 主题将不会应用该策略。仅放置 DependsOn 将创建循环依赖。
    • @gusto2,感谢您的反馈,确切地说,缺少的部分是要创建的资源策略,并且作为依赖项提及,而不仅仅是 DependsOn!非常感谢您提供此信息
    【解决方案2】:

    我有一个example cloudformation 创建存储桶、sns 主题和通知配置。如前所述,您需要确保正确的依赖顺序。

    通知配置不检查资源是否存在,因此我们需要使用DependsOn 属性来检查资源是否存在

    在创建 SNS 主题策略时,还要注意潜在的循环引用。我将存储桶名称定义为字符串,而不是引用。它允许在存储桶的通知配置之前使用其策略创建一个 SNS。

      IngestionBucketDev:
        Type: AWS::S3::Bucket
        DependsOn:
         - IngestionTopicDev
         - IngestionTopicPolicy
        Properties: 
          BucketName: "ingestion-codebucket-7832df8b-dev"
          NotificationConfiguration:
            TopicConfigurations:
             -  Topic: !Ref IngestionTopicDev
                Event: 's3:ObjectCreated:*'
                Filter:
                  S3Key:
                    Rules:
                     - Name: suffix
                       Value: ".json"
          PublicAccessBlockConfiguration:
            RestrictPublicBuckets: true
            BlockPublicPolicy: true
               
                   
      IngestionTopicDev:
        Type: AWS::SNS::Topic
        Properties: 
          TopicName: "elearn-ingest-topic"
          DisplayName: "elearn-ingest-topic"
          
      IngestionTopicPolicy:
        Type: AWS::SNS::TopicPolicy
        Properties: 
          Topics:
           - !Ref IngestionTopicDev
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Action:
                  - 'sns:Publish'
                Effect: Allow
                Resource: !Ref IngestionTopicDev
                Principal: 
                  Service: "s3.amazonaws.com"
                Condition:
                  ArnEquals:
                   "aws:SourceArn": "arn:aws:s3:::ingestion-codebucket-7832df8a-dev"
    
    

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2017-09-06
      • 2017-12-12
      • 2018-11-26
      • 1970-01-01
      • 2021-04-24
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多