AWS Lambda:如何使用必须在 linux 中首先安装的工具?

AWS Lambda: How to use tools that must be installed first in linux?

我了解 AWS Lambda 运行在隔离环境的应用层上。

在很多情况下,功能需要使用第三方工具,必须先在 linux 机器上安装。例如,媒体处理功能使用exiftool从图像中提取元数据,所以我先安装exiftool

现在我想将媒体处理代码迁移到 AWS Lambda 中。我的问题是,如何使用那些我原本必须安装在 linux 上的工具?我的代码是Java写的,需要exiftool

您的 Lambda 函数执行的所有内容都必须包含在您上传的部署包中。

这意味着如果你想运行 Java代码,你可以参考其他Java库。 (同样,如果你想运行 Node.js代码,你可以参考其他Node库。)

Regardless of the tools you use, the resulting .zip file must have the following structure:

  • All compiled class files and resource files at the root level.

  • All required jars to run the code in the /lib directory.

(source)

或者您可以上传 .jar 文件。

另一方面,

exiftool 是一个 Perl 命令行程序。我怀疑在你的本地机器上,你 shell 从你的 Java 代码和 运行 出来。

你不能在 AWS Lambda 中这样做。你需要找到一个 Java 包来提取 EXIF 信息(我相信有很多可供选择)和将其包含在您的部署包中。您无法在 Lambda 上安装软件包。

https://aws.amazon.com/lambda/faqs/

Q: What languages does AWS Lambda support?

AWS Lambda supports code written in Node.js (JavaScript), Python, and Java (Java 8 compatible). Your code can include existing libraries, even native ones. Please read our documentation on using Node.js, Python and Java.

所以基本上你可以调出预安装的本机进程,但只能从 JavaScript 和 Java 作为父进程。

要大致了解已安装的内容,请查看已安装的软件包:

https://gist.github.com/royingantaginting/4499668

此列表不会 100% 准确,要做到这一点,您需要直接查看 AMI 图像 (ami-e7527ed7)

exiftool 似乎没有默认安装。我怀疑使用 lambda 函数的帐户 运行 是否有足够的权限在全局安装任何东西,但你总是可以将 exiftool 与你的节点或 Java 函数捆绑在一起。

您可能还想看看 lambdash (https://github.com/alestic/lambdash),它允许您从本地命令行在远程 lamdba 实例上运行命令

为了扩展 Daniel 的回答,如果您想要捆绑 exiftool,您可以针对 official install instructions 中的 Unix/Linux 平台执行步骤 1 和 2。然后,您将在函数的 zip 文件中包含 exiftoollib。要 运行 exiftool 你会做这样的事情:

const exec = require('child_process').exec;

exports.handler = (event, context, callback) => {
  // './exiftool' gave me permission denied errors
  exec('perl exiftool -ver', (error, stdout, stderr) => {
    if (error) {
      callback(`error: ${error}`);
      return;
    }
    callback(null, `stderr: ${stderr} \n stdout: ${stdout}`);
  });
}

现在可以使用 AWS Lambda Layers 完成此操作。

可以在此处找到有关如何专门为 exiftool 准备图层的示例:

https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a