簡體   English   中英

如何使用無服務器框架在 AWS Lambda 函數上添加 S3 觸發事件?

[英]How to add S3 trigger event on AWS Lambda function using Serverless framework?

我想在現有存儲桶上的 Lambda 函數上添加觸發事件,為此我使用以下配置:

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

其中存儲桶serverlesstest已存在於 S3 上。

此配置引發錯誤:

配置堆棧時出錯:S3BucketServerlesstest - serverlesstest 已存在。

如何使用無服務器框架解決此錯誤?

由於 CloudFormation 行為,目前在核心框架中無法實現。 也許。

但是你可以使用這個插件。

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

通過npm install 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

遺憾的是,您無法指定現有 S3 存儲桶來觸發 Lambda 函數,因為無服務器框架*無法使用 Cloud Formation 更改現有基礎設施。 此配置要求您創建一個存儲桶。

您可以在 GitHub 上打開的以下問題中閱讀更多信息:

* 我會嘗試使用 AWS 控制台或 SDK 而不是 Serverelss 框架來配置此觸發器。

從無服務器版本 v1.47.0 開始,通過將existing: true標志添加到您的事件配置中,這是可能的: https existing: true //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 資源。

serverless.yml似乎對空格非常敏感。 對我來說, 這個建議很有幫助。

如果配置看起來像這樣

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

您需要在存儲桶、事件和規則的縮進中再添加 2 個空格:

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

如果存儲桶是在堆棧中的其他地方使用無服務器創建的,那么您可以使用- s3: Bucket: { Ref: serverlesstest }否則您必須自己構建名稱或 ARN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM