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 文件中包含 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}`);
});
}
现在可以使用 AWS Lambda Layers 完成此操作。
可以在此处找到有关如何专门为 exiftool 准备图层的示例:
https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a
我了解 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 文件中包含 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}`);
});
}
现在可以使用 AWS Lambda Layers 完成此操作。
可以在此处找到有关如何专门为 exiftool 准备图层的示例:
https://gist.github.com/hughevans/6b8c57839b8194ba910428de4375794a