我有一个现有的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的建议,但是我的存储桶不是使用堆栈创建的。
该框架允许您自定义其创建的资源,并且您始终可以配置通过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存储桶。