【问题标题】:Schedule a lambda function to execute all objects in s3安排一个 lambda 函数来执行 s3 中的所有对象
【发布时间】:2023-04-02 06:28:01
【问题描述】:

我的要求是,文件(1000)将被上传到 s3 存储桶。一旦上传,s3:Put Object 事件将被触发,它将为上传到 s3 的对象运行 lambda 函数。转换将发生并且转换后的结果也存储在另一个存储桶中的 s3 中。现在我对我的 lambda 函数代码做了一个小改动。我需要这个更改来反映所有转换后的结果。为此,我需要安排 lambda 函数已上传的文件(1000 个文件)并触发 lambda 函数进行转换,然后再次覆盖我已经存储了转换结果的另一个存储桶。

我的问题是:如何安排 lambda 函数获取已上传的文件(1000 个文件)并触发 lambda 函数进行转换并再次覆盖我已经存储了转换结果的另一个存储桶?

注意:所有 1000 个文件都必须按顺序执行,因为文件的转换结果存储在同一个输出文件中。所以我将保留并发限制为 1

设置:使用 AWS 控制台 UI,编程语言:Python,文件大小:50 MB

【问题讨论】:

  • 您可以通过命令行或 UI 控制台运行 Lambda 吗?现在是什么触发了PutObject 事件?
  • @stdunbar 我正在通过 UI 控制台运行 lambda

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


【解决方案1】:

您可以将对象复制到自身之上,这将导致 AWS Lambda 函数再次运行。

复制对象时,你需要做一些不同的事情,否则你会得到这个错误:

复制失败:调用 CopyObject 操作时发生错误 (InvalidRequest):此复制请求是非法的,因为它试图将对象复制到自身而不更改对象的元数据、存储类、网站重定向位置或加密属性。

因此,您可以在执行复制时添加一些元数据

aws s3 cp --recursive s3://bucket/folder/ s3://bucket/folder/ --metadata ignore=ignore

首先在一个文件上尝试(不带 `--recursive)以确认它是否符合您的要求,然后执行递归复制。

【讨论】:

    【解决方案2】:

    您的工作流程/管道基本上是这样的:

    AWS 确实支持触发 lambda 函数的其他方式,例如 cloudwatch、SQS 和 SNS 等消息传递系统等。

    话虽如此,根据您所描述的场景,不仅仅是安排 lambda 再次运行,而是与您的代码的工作方式、文件大小、文件数量以及这是否是“只做一次”。

    在这种情况下,重构管道(假设文件很大)的一种解决方案类似于链接中的图像 here

    1. 另一个 lambda 列出着陆桶的内容(触发 lambda)
    2. 触发器 lambda 使用 cloudwatch 事件规则(cron exp)
    3. 列出内容后,触发器会使用从源存储桶中列出的对象收集的参数运行每个转换 lambda(如果这是 Python 代码,请检查 boto3 示例以列出对象)。

    有关如何使用 lambdas 触发另一个 lambdas 的更多详细信息,请参见此处 (https://aws.amazon.com/blogs/architecture/a-serverless-solution-for-invoking-aws-lambda-at-a-sub-minute-frequency/)。

    如果文件非常小并且每个 lambda 执行只需要很少的时间,那么另一种解决方案是为相同的东西创建 bash 脚本(从您的机器)并使用 awscli 列出登录存储桶中的对象。

    然后使用 for 循环,您可以从终端运行相同的 lambda,将 s3 文件作为 args 传递给 lambda 有效负载(类似这样)。

    #!/bin/bash
    aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 2017-07-10
      • 2017-02-21
      • 2018-01-08
      • 2019-10-19
      • 2021-07-22
      • 2019-11-18
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多