我了解AWS Lambda在隔离环境的应用程序层上运行。
在许多情况下,功能需要使用必须首先安装在Linux机器上的第三方工具。例如,媒体处理功能使用exiftool从图像中提取元数据,因此我首先安装exiftool
。
现在我想将媒体处理代码迁移到AWS Lambda。我的问题是,我如何使用我最初必须在linux上安装的工具?我的代码是用Java编写的,exiftool
是必需的。
答案 0 :(得分:3)
要扩展Daniel的答案,如果你想捆绑exiftool
,你可以按照official install instructions的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}`);
});
}
答案 1 :(得分:1)
您的Lambda函数执行的所有内容都必须包含在您上传的部署包中。
这意味着如果要运行Java代码,可以引用其他Java库。 (同样,如果要运行Node.js代码,可以引用其他Node库。)
无论使用哪种工具,生成的.zip文件都必须具有以下结构:
根级别的所有已编译的类文件和资源文件。
运行/ lib目录中的代码所需的所有jar。
(source)
或者您可以上传.jar文件。
另一方面, exiftool
是一个Perl命令行程序。我怀疑在你的本地机器上,你从Java代码中解脱出来并运行它。
您无法在AWS Lambda中执行此操作。您需要找到一个提取EXIF信息的Java包(我相信有很多可供选择)并将其包含在您的部署包中。您无法在Lambda上安装软件包。
答案 2 :(得分: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函数捆绑在一起。
您可能还想查看lambdash(https://github.com/alestic/lambdash),它允许您从远程lamdba实例上的本地命令行运行命令
答案 3 :(得分:0)
现在可以使用AWS Lambda Layers完成此操作。
可以在此处找到有关如何为exiftool专门准备图层的示例:
https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a