3

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

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

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

4

4 回答 4

3

为了扩展丹尼尔的答案,如果您想捆绑exiftool,您将按照官方安装说明中的 Unix/Linux 平台的步骤 1 和 2 进行操作。然后,您将在函数的 zip 文件中包含exiftool和。lib要运行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}`);
  });
}
于 2017-12-13T00:16:58.910 回答
1

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

问:AWS Lambda 支持哪些语言?

AWS Lambda 支持用 Node.js (JavaScript)、Python 和 Java(兼容 Java 8)编写的代码。您的代码可以包含现有库,甚至是本地库。请阅读我们关于使用 Node.js、Python 和 Java 的文档。

所以基本上你可以调用本地进程,如果它们是预先安装的,但只能从作为父进程的 JavaScript 和 Java 调用。

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

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

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

exiftool默认情况下似乎没有安装。我怀疑运行 lambda 函数的帐户是否有足够的权限在全局范围内安装任何东西,但你总是可以exiftool与你的 Node 或 Java 函数捆绑在一起。

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

于 2015-08-19T21:14:11.447 回答
1

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

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

无论您使用何种工具,生成的 .zip 文件都必须具有以下结构:

  • 所有已编译的类文件和根级别的资源文件。

  • 运行 /lib 目录中的代码所需的所有 jar。

来源

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

exiftool另一方面,它是一个 Perl 命令行程序。我怀疑在您的本地机器上,您从 Java 代码中取出并运行它。

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

于 2015-07-13T18:07:12.283 回答
0

这现在可以使用AWS Lambda Layers来完成。

具体如何为 exiftool 准备层的示例可以在此处找到:

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

于 2020-01-17T14:05:01.377 回答