我目前正在将Node.js 8.10 Runtime与php.handler一起使用,并且我的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版本,但是我不知道如何克服此错误,因此我们将不胜感激!
答案 0 :(得分:1)
简单的解决方法是在您的PHP代码之上添加:
set_include_path('/opt/lib64’);
如果这行不通,则需要您自己编译/构建/安装缺少的模块/库:
确保Lambda代码已定义正确的PATH以使用Layer文件夹。
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
docker run --rm -it -v /your/path/to/Layer/folder/:/opt:rw,delegated amazonlinux:latest
(请记住,Layer文件夹已安装为具有读/写权限)。
cd /var/task
node index.js; node "var func = require('./index.js');func.handler({},function() {},function(){console.log('Lambda finished')});"
set_include_path('/opt/lib');
cp /usr/lib64/[here is your library name] /opt/lib
答案 1 :(得分:1)
我通过在函数的zip中添加额外的库文件夹来解决此问题。
命名为extra-libs
使用以下步骤将所有必需的库从Amazon Linux 2
复制到Extra-libs
:
通过以下命令运行Amazon Linux 2的docker实例
docker run --rm -it -v :/opt:rw,delegated amazonlinux:latest
然后在docker实例的make目录中使用
mkdir deps
使用
将所有必需的库从lib64复制到deps目录 cp -f lib64/libcrypt.so.1 deps
(以libcrypt.so.1为例)
然后打开另一个终端窗口,并将所有库文件移至本地Extra-libs
docker cp <DOCKER_CONTAINER_ID>:/deps/ . && mv deps/* ./extra-libs
使用docker ps
然后在index.js文件中,将以下行添加到php的环境设置中。
LD_LIBRARY_PATH:path.join(__dirname, '/extra-libs')
使用lambda函数压缩Extra-libs文件夹并上传。
希望这会有所帮助。
答案 2 :(得分:0)
首先,为什么您要使用节点加载php?
但是,如果您以前曾做过这项工作,为什么需要更新到节点12?
如果要从节点8升级,则运行时会有所不同: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
然后在这里看看: https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/
您可能需要基于AWS的node12内置运行时来创建新的自定义运行时。