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

Ron*_*ane 7 amazon-s3 amazon-web-services aws-lambda serverless-framework

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

 events:
      - s3:
          bucket: serverlesstest
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
            - suffix: .pdf
Run Code Online (Sandbox Code Playgroud)

存储桶serverlesstest已存在于S3上.

这种配置引发了错误:

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

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

小智 9

由于CloudFormation行为,目前在核心框架中无法实现.也许.

但是你可以使用这个插件.

https://github.com/matt-filion/serverless-external-s3-event

安装serverless-plugin-existing-s3之后npm install serverless-plugin-existing-s3.

并将插件添加到serverless.yml

plugins:
  serverless-plugin-existing-s3
Run Code Online (Sandbox Code Playgroud)

授予您部署访问存储区的权限.

provider:
  name: aws
  runtime: nodejs4.3
  iamRoleStatements:
    ...
    -  Effect: "Allow"
       Action:
         - "s3:PutBucketNotification"
       Resource:
         Fn::Join:
           - ""
       - - "arn:aws:s3:::BUCKET_NAME or *"
Run Code Online (Sandbox Code Playgroud)

并且使用existingS3事件,它不仅仅是s3.

functions:
  someFunction:
    handler: index.handler
    events:
      - existingS3:
          bucket: BUCKET_NAME
          events:
            - s3:ObjectCreated:*
          rules:
            - prefix: images/
            - suffix: .jpg
Run Code Online (Sandbox Code Playgroud)

sls deploy命令之后,您可以使用sls s3deploy命令附加事件.

功能提案

它将来会在某一天被添加.

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


Zan*_*non 5

遗憾的是,您无法指定现有 S3 存储桶来触发 Lambda 函数,因为无服务器框架*无法使用 Cloud Formation 更改现有基础设施。此配置要求您创建一个存储桶。

您可以在 GitHub 上打开的以下问题中阅读更多信息:

* 我会尝试使用 AWS 控制台或 SDK 而不是 Serverelss 框架来配置此触发器。


Ula*_*ach 5

从无服务器版本 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
Run Code Online (Sandbox Code Playgroud)

来源提供了以下警告:

重要提示:每个函数只能附加 1 个现有的 S3 存储桶。

注意:使用现有配置将向您的堆栈添加额外的 Lambda 函数和 IAM 角色。Lambda 函数备份用于支持现有 S3 存储桶的自定义 S3 资源。

  • @DemonGyro @garryp 请注意,此功能创建了一个额外的 lambda 函数 `yourservicenameandstage-custom-resource-existing-s3`。如果未创建此附加 lambda 函数,请尝试检查“-s3”标记中参数的缩进。请注意,参数在父标记后面有 4 个空格,而不是 2 个空格。我有一个类似的问题,这为我解决了它,所以希望它有帮助。 (4认同)
  • 它什么也不做。我使用的是 Serverless 1.5.0,它完全忽略了这个属性。我从字面上复制粘贴了文档中的代码并进行了一些重命名。完全损坏的功能。 (2认同)

小智 3

如果存储桶是在堆栈中的其他位置使用无服务器创建的,那么您可以使用 - s3: Bucket: { Ref: serverlesstest } 否则您必须自己构建名称或 ARN。

  • 现在我可以成功上传函数,但 Lambda 函数上仍然缺少触发事件。 (3认同)