使用cloudformation / lessless从现有存储桶S3创建事件中创建SNS消息

问题描述 投票:1回答:1

我有一个现有的s3存储桶不是由无服务器/ cloudformation堆栈创建的。我也有一个无服务器堆栈,其中包含一堆由s3创建的具有不同前缀的事件触发的lambda。我需要通过SNS发送一些s3 create事件,以便可以在另一个系统中使用它。

在我的serverless.yaml中,有一个资源部分,可以在其中创建SNS主题和策略。这似乎工作正常:

resources:
  Resources:
    # Create a topic for the created s3 documents to be published on.
    MyS3ToSnsTopic:
      Type: AWS::SNS::Topic
      Properties:
        DisplayName: 'Topic to notify new s3-to-sns s3 document was created'
        TopicName: s3-to-sns
    # Policy for Bucket to publish sns messages to `s3-to-sns` topic
    MyS3ToSnsTopicPolicy:
      Type: AWS::SNS::TopicPolicy
      Properties:
        PolicyDocument:
          Id: MyS3ToSnsTopicPolicy
          Version: '2012-10-17'
          Statement:
          - Sid: s3-to-sns-id
            Effect: Allow
            Principal:
              AWS: "*"
            Action: sns:Publish
            Resource: !Join [':', ['arn:aws:sns:us-west-2', Ref: 'AWS::AccountId', 's3-to-sns']]
            Condition:
              ArnLike:
                "aws:SourceArn": "arn:aws:s3:*:*:${self:custom.bucketName.${self:provider.stage}}"
        Topics:
        - !Ref MyS3ToSnsTopic

当我进入存储桶->属性->事件时,我可以手动添加一个侦听前缀/后缀并可以发布到该主题的事件。因此,最后一步是使用cloudformation创建事件,而不是手动进行。

当我无服务器时,基于create事件创建一个lambda触发器时,它会生成以下内容:

SomeFunctionNameCustomS31:
  Type: Custom::S3
  Version: 1
  DependsOn:
  - SomeFunctionNameLambdaFunction
  - CustomDashresourceDashexistingDashs3LambdaFunction
  Properties:
    ServiceToken:
      Fn::GetAtt:
      - CustomDashresourceDashexistingDashs3LambdaFunction
      - Arn
    FunctionName: some-function-name
    BucketName: some-bucket-name
    BucketConfigs:
    - Event: s3:ObjectCreated:*
      Rules:
      - Prefix: metrics/
      - Suffix: ".json"

是否可以对SNS做类似的事情,但是要使用FunctionName代替使用TopicName?还有哪些其他属性需要添加或更改?当您使用堆栈创建存储桶时,我已经看到有关NotificationConfiguration的建议,但是我的存储桶不是使用堆栈创建的。

amazon-web-services amazon-s3 amazon-cloudformation amazon-sns serverless-framework
1个回答
0
投票

该框架允许您自定义其创建的资源,并且您始终可以配置通过Resources块手动创建的任何资源。两者都允许您设置允许订阅SNS的NotificationConfiguration

resources:
  Resources:
    MyBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.bucketName}
        NotificationConfiguration:
          TopicConfigurations:
            - Event: s3:ObjectCreated:*
              Topic:
                Ref: MySnsTopic

documentation还详细说明了如何自定义框架创建的S3存储桶。

© www.soinside.com 2019 - 2024. All rights reserved.