我了解 AWS Lambda 在隔离环境的应用层上运行。
很多情况下,函数需要使用第三方工具,必须先安装在linux机器上。比如一个媒体处理函数使用exiftool从图像中提取元数据,所以我exiftool
先安装。
现在我想将媒体处理代码迁移到 AWS Lambda。我的问题是,我如何才能使用那些我原本必须安装在 linux 上的工具?我的代码是用 Java 编写的,并且exiftool
是必要的。
我了解 AWS Lambda 在隔离环境的应用层上运行。
很多情况下,函数需要使用第三方工具,必须先安装在linux机器上。比如一个媒体处理函数使用exiftool从图像中提取元数据,所以我exiftool
先安装。
现在我想将媒体处理代码迁移到 AWS Lambda。我的问题是,我如何才能使用那些我原本必须安装在 linux 上的工具?我的代码是用 Java 编写的,并且exiftool
是必要的。
为了扩展丹尼尔的答案,如果您想捆绑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}`);
});
}
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 实例上的本地命令行运行命令
您的 Lambda 函数执行的所有内容都必须包含在您上传的部署包中。
这意味着如果您想运行 Java 代码,您可以参考其他 Java 库。(同样,如果你想运行 Node.js 代码,你可以参考其他的 Node 库。)
无论您使用何种工具,生成的 .zip 文件都必须具有以下结构:
所有已编译的类文件和根级别的资源文件。
运行 /lib 目录中的代码所需的所有 jar。
(来源)
或者,您可以上传 .jar 文件。
exiftool
另一方面,它是一个 Perl 命令行程序。我怀疑在您的本地机器上,您从 Java 代码中取出并运行它。
您不能在 AWS Lambda 中这样做。您需要找到一个提取 EXIF 信息的 Java 包(我相信有很多可供选择)并将其包含在您的部署包中。您不能在 Lambda 上安装软件包。
这现在可以使用AWS Lambda Layers来完成。
具体如何为 exiftool 准备层的示例可以在此处找到:
https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a