【问题标题】:How to add S3 trigger event on AWS Lambda function using Serverless framework?如何使用无服务器框架在 AWS Lambda 函数上添加 S3 触发事件?
【发布时间】:2017-12-02 17:46:29
【问题描述】:

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

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

存储桶serverlesstest 已存在于 S3 上。

此配置抛出错误:

配置堆栈时出错:S3BucketServerlesstest - serverlesstest 已存在。

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

【问题讨论】:

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


    【解决方案1】:

    由于 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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      从无服务器版本 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 资源。

      【讨论】:

      • 它什么都不做。我在无服务器 1.5.0 上,它完全忽略了这个属性。我从字面上复制粘贴了文档中的代码,并进行了一些重命名。完全损坏的功能。
      • 我在 1.58.0 上遇到了同样的问题(在撰写本文时最新)。我必须手动创建事件触发器。我真的希望这能奏效......
      • @DemonGyro @garryp 请注意,此功能会创建一个额外的 lambda 函数 yourservicenameandstage-custom-resource-existing-s3。如果未创建此附加 lambda 函数,请尝试检查 - s3 标记中参数的缩进。请注意,参数在父标记后有 4 个空格而不是 2 个空格。我有一个类似的问题,这为我解决了,所以希望它有所帮助。
      • 感谢您的提示。我决定处理一些不同的事情,所以我不再需要这个功能,但如果我再试一次,我肯定会记住间距。
      【解决方案4】:

      serverless.yml 似乎对空格非常敏感。对我来说,this 的建议很有帮助。

      如果配置看起来像这样

      functions:
        hello:
          handler: handler.main
          events:
            - s3: 
              bucket: codepipeline-us-east-1-213458767560
              event: s3:ObjectCreated:*
              rules:
                - prefix: test/MyAppBuild
      

      你需要在bucket、event和rules的缩进中多加2个空格:

      functions:
        hello:
          handler: handler.main
          events:
            - s3: 
                bucket: codepipeline-us-east-1-213458767560
                event: s3:ObjectCreated:*
                rules:
                  - prefix: test/MyAppBuild
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 现在我可以成功上传函数,但 Lambda 函数上仍然缺少触发事件。
        猜你喜欢
        • 1970-01-01
        • 2020-10-21
        • 2020-01-29
        • 2021-03-20
        • 2019-07-23
        • 2018-01-16
        • 2019-01-02
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多