我想在现有存储桶上的Lambda函数上添加触发事件,为此我使用以下配置:
events:
- s3:
bucket: serverlesstest
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .pdf
其中存储桶serverlesstest
已存在于S3上。
此配置引发错误:
配置堆栈时发生错误:S3BucketServerlesstest - serverlesstest已存在。
如何使用无服务器框架解决此错误?
答案 0 :(得分:9)
由于CloudFormation行为,目前在核心框架中无法实现。也许
但你可以使用这个插件。
https://github.com/matt-filion/serverless-external-s3-event
在npm install serverless-plugin-existing-s3
安装serverless-plugin-existing-s3之后。
并将插件添加到serverless.yml
plugins:
serverless-plugin-existing-s3
授予您部署访问存储区的权限。
provider:
name: aws
runtime: nodejs4.3
iamRoleStatements:
...
- Effect: "Allow"
Action:
- "s3:PutBucketNotification"
Resource:
Fn::Join:
- ""
- - "arn:aws:s3:::BUCKET_NAME or *"
使用existingS3
事件,不仅仅是s3
。
functions:
someFunction:
handler: index.handler
events:
- existingS3:
bucket: BUCKET_NAME
events:
- s3:ObjectCreated:*
rules:
- prefix: images/
- suffix: .jpg
sls deploy
命令后,
您可以使用sls s3deploy
命令附加事件。
它将在某一天被添加。
答案 1 :(得分:4)
不幸的是,您无法指定现有的S3存储桶来触发Lambda函数,因为无服务器框架*无法使用Cloud Formation更改现有基础架构。此配置要求您创建新存储桶。
您可以在以下GitHub上打开的问题中阅读更多内容:
*我会尝试使用AWS控制台或SDK而不是Serverelss框架来配置此触发器。
答案 2 :(得分:2)
从无服务器版本v1.47.0开始,这可以通过向事件配置中添加existing: true
标志来实现:https://serverless.com/framework/docs/providers/aws/events/s3/
来源示例:
functions:
users:
handler: users.handler
events:
- s3:
bucket: legacy-photos
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .jpg
existing: true # <- this makes it work with existing objects
源提供以下警告:
重要提示:每个功能只能附加1个现有S3存储桶。
注意:使用现有配置会将额外的Lambda函数和IAM角色添加到您的堆栈中。 Lambda函数备份自定义S3资源,该资源用于支持现有的S3存储桶。
答案 3 :(得分:2)
function timer() {
for (let i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, i * 2000);
}
}
timer();
似乎对空格非常敏感。对我来说this的建议很有帮助。
如果配置看起来像这样
serverless.yml
您需要在存储区,事件和规则的缩进中再添加2个空格:
functions:
hello:
handler: handler.main
events:
- s3:
bucket: codepipeline-us-east-1-213458767560
event: s3:ObjectCreated:*
rules:
- prefix: test/MyAppBuild
答案 4 :(得分:1)
如果存储桶是使用堆栈中其他位置的无服务器创建的,那么您可以使用
- s3:
Bucket: { Ref: serverlesstest }
否则,您必须自己构建名称或ARN。