【问题标题】:How to Specify Additional Parameter to AWS Lambda Function Triggered by S3如何为 S3 触发的 AWS Lambda 函数指定附加参数
【发布时间】:2017-11-28 03:34:15
【问题描述】:

我正在创建一个为 S3 存储桶上的每个 PUT 触发的 AWS Lambda 函数。一个单独的 Java 应用程序创建 S3 存储桶,在 Put 上设置 Lambda 触发器,并将一组文件放入存储桶。 Lambda 函数执行已编译的二进制文件,它向二进制文件传递一个脚本,该脚本作用于新的 S3 对象。

所有这些都运行良好。

我的问题是我有一组接近 100 个不同的脚本,并且经常开发新的脚本。 Lambda 的 ZIP 包含所有脚本。脚本对应不同类型的文件,所以当我运行 Java 应用程序时,我想在 Lambda 函数中指定要使用的哪个脚本。我试图避免为每个脚本创建一个新的 Lambda,因为每个脚本都有效地执行完全相同的操作,但脚本名称不同。

当您调用 Lambda 时,您可以将参数放入上下文中。但是我的 Lambda 被触发了,所以我的大部分反应都是在事件中。当我设置 S3 存储桶和事件触发器时,我无法弄清楚如何将这个简单的参数有效地传递给 Lambda。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    您不能让 S3 向您的 Lambda 函数发布额外参数。您可以创建一个 DynamoDB 表,将 S3 存储桶映射到脚本,或将 S3 前缀映射到脚本,或类似的东西。然后,您的 Lambda 函数可以在执行脚本之前查找该映射。

    【讨论】:

    • 这是我想避免的查找的延迟和成本。我曾考虑将每个对象 PUT 的名称添加到带有脚本名称的存储桶中,例如 scriptname/objectname 并以这种方式解析它。它只是看起来不太优雅。
    • 在 Lambda 函数中缓存地图,因此它只需要在遇到以前未执行的查找时返回到 DynamoDB。如果表足够小,您甚至可以在首次调用 Lambda 函数时拉下整个表。
    • 如果您完全控制 S3 PUT 操作,那么您可以在上传对象时向对象添加元数据,这将向您的 Lambda 函数指示要使用哪个脚本:docs.aws.amazon.com/AmazonS3/latest/dev/…
    • 我认为您对这些元数据有所了解。现在看看。
    【解决方案2】:

    无法指定传递给 AWS Lambda 函数的参数。该函数由 Amazon S3 触发,传递标准信息(bucket、key)。

    但是,在 Amazon S3 中创建对象时,您可以附加对象元数据。然后,Lambda 函数可以在收到事件通知后检索元数据。

    另一种方法是订阅多个 Lambda 函数到 S3 存储桶。这些函数可以查看事件并决定是否处理该事件。

    例如,如果您要存储图片和文本文件,您可以为图片创建一个 Lambda 函数,为文本文件创建另一个函数。这两个函数都将在对象创建时触发。每个函数都会查看文件扩展名(或者,如果需要,查看对象本身)。如果它是句柄的文件类型,那么它可以处理该对象。如果它不是它处理的文件类型,函数可以简单地退出。这种类型的检查可以非常快速地执行,并且 Lambda 仅每 100ms 收费,因此成本几乎无关紧要。

    这种方法的好处是您可以将库彼此分开,而不是制作一个大型 Lambda 包。

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2019-01-02
      • 2021-05-01
      • 2018-01-01
      • 2020-10-21
      • 2019-08-23
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多