如何使用无服务器框架在AWS Lambda函数上添加S3触发器事件?

时间:2017-06-29 06:45:11

标签: amazon-web-services amazon-s3 aws-lambda serverless-framework

我想在现有存储桶上的Lambda函数上添加触发事件,为此我使用以下配置:

 events:
      - s3:
          bucket: serverlesstest
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
            - suffix: .pdf

其中存储桶serverlesstest已存在于S3上。

此配置引发错误:

  

配置堆栈时发生错误:S3BucketServerlesstest - serverlesstest已存在。

如何使用无服务器框架解决此错误?

5 个答案:

答案 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命令附加事件。

功能提案

它将在某一天被添加。

https://github.com/serverless/serverless/issues/4241

答案 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。