php - 带有 php.handler 节点 12.x 错误的 AWS Lambda - 已解决
问题描述
更新:谢谢大家!我通过为我的 PHP Lambda 创建自定义运行时解决了这个问题。
我目前正在使用带有 php.handler 的 Node.js 8.10 Runtime,并且我的 Lambda 函数工作正常,但是当我将 Runtime 更改为 12.x 时,出现以下错误:
“php-7-bin/bin/php:加载共享库时出错:libcrypt.so.1:无法打开共享对象文件:没有这样的文件或目录”
exports.handler = function(event, context, callback) {
var php = spawn('php-7-bin/bin/php',['--php-ini', 'user.ini', process.env['PHPFILE']], {maxBuffer: 200 * 1024 * 200});
var output = "";
var statusCode = 0;
php.stdin.write(JSON.stringify(event));
php.stdin.end();
php.stdout.on('data', function(data) {
console.log("CHUNK: " + data);
output+=data;
});
php.stderr.on('data', function(data) {
console.log(data);
});
php.on('close', function(code) {
var obj = JSON.parse(output);
statusCode = obj.status.statusCode;
if(statusCode !== 0){
callback(output);
}else{
context.succeed(obj);
}
});
}
我需要将我的 Lambda 更新到最新的 node.js 版本,但我不知道如何克服这个错误,所以任何帮助将不胜感激!
解决方案
简单的解决方法是在您的 PHP 代码之上添加:
set_include_path('/opt/lib64’);
如果这不起作用,您需要自己编译/构建/安装缺少的模块/库:
- 运行两个将挂载相同“本地”层文件夹的 docker 实例。
- 第一个容器将是您的 lambda 容器,而第二个容器是用于构建项目的 Amazon linux。
- 使用 Lambda 容器测试您的代码,如果缺少某些内容,请切换到 Amazon Linux 并将二进制文件/库构建/提取到共享层文件夹结构中。
确保 Lambda 代码定义了正确的 PATH 以使用层文件夹。
- 安装泊坞窗。
- 在第一个终端选项卡中,转到您的 lambda 文件夹并启动 lambda docker 容器:
docker run --rm -it --entrypoint=/bin/bash -v "$PWD":/var/task:ro,delegated -v /your/path/to/Layer/folder/:/opt:rw,delegated -e AWS_ACCESS_KEY_ID=[ACCESS_KEY_PASTE_HERE -e AWS_SECRET_ACCESS_KEY=[SECRET_GOES_HERE] lambci/lambda:nodejs12.x
- 在第二个终端选项卡中,使用 Amazon linux 运行另一个容器:
docker run --rm -it -v /your/path/to/Layer/folder/:/opt:rw,delegated amazonlinux:latest
(请记住,Layer 文件夹是使用读/写权限安装的)。
- 以您喜欢的方式或仅通过简单的运行测试您的 lambda 代码(确保检查您的处理程序模块名称是否为“handler”,文件名是否为“index.js”):
cd /var/task
node index.js; node "var func = require('./index.js');func.handler({},function() {},function(){console.log('Lambda finished')});"
- 如果您发现一些缺少的库,请确保添加到您的 PHP 代码中:</li>
set_include_path('/opt/lib');
- 然后在 Amazon Linux 终端选项卡上安装/构建您的库,然后将其复制到层文件夹:
cp /usr/lib64/[here is your library name] /opt/lib
- 在 Lambda 容器中再次测试您的代码。
- 完成后,只需压缩 Lambda 层结构的内容,请记住,您的 \bin or \lib 文件夹需要位于 zip 文件的根文件夹中。
- 将 zip 文件添加为您的 lambda 图层并附加它。
推荐阅读
- javascript - 访问 api 子链接
- r - 使用 R 加载库,但不使用 Rscript
- java - Maven、Jersey、JSON、Tomcat、错误 MessageBodyWriter 未找到媒体类型 = 应用程序/json
- python - 使用 NN 加速多标签分类训练
- asciidoc - 如何将 asciidoc 转换为 pdf?
- android - Android 上的自定义字体会降低性能吗?
- python - 以前的解决方案不起作用:TypeError: 'str' object is not callable
- python - Tensorflow 的损失函数在将 RNN 更改为 LSTM 单元后返回 NAN
- .net - .NET Core React Redux 模板 JS 404 部署问题
- javascript - 使用未捆绑的外部全局变量文件