【问题标题】:Lambda funciton not triggering after s3 uploads3上传后未触发Lambda函数
【发布时间】:2021-06-24 02:28:58
【问题描述】:

我正在尝试在上传文件后触发 Lambda 函数。

下面我定义了file Lambda 函数。在其中,一个文件被上传到 s3。然后我希望process Lambda 函数触发。但是,我无法触发它。此外,在 AWS s3 中,存储桶属性 > 事件通知为空。

我的 serverless.yml:

service: backend
frameworkVersion: "2"

package:
  exclude:
    - "frontend/**"

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true
    dockerFile: ./dockerfile

provider:
  name: aws
  runtime: python2.7
  stage: dev
  lambdaHashingVersion: 20201221
  apiGateway:
    shouldStartNameWithService: true
  environment:
    STORAGE_BUCKET: dev-storage-bucket-01392334
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:PutObjectAcl
        - s3:GetObject
        - s3:GetObjectAcl
        - s3:DeleteObject
      Resource: 
        - "arn:aws:dynamodb:us-east-1:*:*"
        - "arn:aws:s3:::*"

functions:
  process:
    handler: handler.process
    events:
      - s3:
        bucket: ${self:provider.environment.STORAGE_BUCKET}
        events: s3:ObjectCreated:*
        existing: true
  file:
    handler: handler.file
    events:
      - http:
          method: POST
          path: /file


resources:
  Resources:
    storage:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:provider.environment.STORAGE_BUCKET}

在我的处理程序中,我有:

def process(event, context):

    print("in process")


def fcsfile(event, context):
    uploaded_file = event['body']

    s3 = boto3.resource('s3')
    object = s3.Object(STORAGE_BUCKET, 'the_file_name')
    s3_response = object.put(Body=uploaded_file)

    print(s3_response)
    response = {
        "statusCode": 200,
        "body": json.dumps(response)
    }
    return response

当我对端点执行 CURL 时,文件会上传到 s3,但不会触发进程功能。

我已尝试删除“现有:真”。结果相同。我尝试将存储桶名称更改为完全不同的名称,例如'dev-storage-bucket-99999999968686' 但随后我看到了错误:

An error occurred: S3BucketDevstoragebucket99999999968686 - dev-storage-bucket-99999999968686 already exists in stack

不,存储桶不存在。

我还能尝试什么?

【问题讨论】:

  • 我的测试显示dev-storage-bucket-99999999968686存在。
  • 您是否在控制台中检查了存储桶以查看该触发器是否确实已创建?
  • @404 如何查看存储桶触发器?
  • @Marcin 我意识到我必须部署 3 次 - 前 2 次会出错
  • @404 我检查了那个buckwt,我在事件通知下什么也没看到

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


【解决方案1】:

看起来你可能有一个小错字。

在handler.process 块中用event 替换events 似乎对我有用:

functions:
  process:
    handler: handler.process
    events:
      - s3:
          bucket: ${self:provider.environment.STORAGE_BUCKET}
          event: s3:ObjectCreated:*
          existing: true

使用events 运行命令时,我收到来自无服务器框架的警告: Serverless: Configuration warning at 'functions.process.events[0]': unsupported function event

这是documentation,它帮助我找到了正确的语法。

【讨论】:

  • 可能是这样,但我看不到 - 现在我看到“发生错误:S3BucketDevstoragebucketzzz - dev-storage-bucket-zzz 已经存在”。该存储桶在 s3 中不存在。我已通过 AWS 控制台删除了整个堆栈 - 我在重新部署的每一本书中仍然会收到此错误。在这一点上,我想知道无服务器框架是否合适——这非常痛苦。
  • @mark 不幸的是,错误来自 AWS,它不是来自无服务器框架。 S3 存储桶名称必须是全局唯一的,因此很可能其他用户看到了这篇文章并测试了您的示例代码,这就是其他用户看到它存在的原因。如果您发现无服务器技术很痛苦,那是很不幸的,有很多资源可以帮助您学习和磨练您的云技能。
猜你喜欢
  • 2020-05-16
  • 2022-06-10
  • 2020-02-09
  • 2019-08-03
  • 2021-08-27
  • 1970-01-01
  • 2017-09-05
  • 2021-02-24
  • 2020-10-22
相关资源
最近更新 更多