更新:谢谢大家!我已经解决了这个问题,为我的PHP Lambda创建了一个自定义的运行时。
我当前使用的是带有php.handler的Node.js 8.10运行时,我的Lambda函数运行良好,但当我将运行时更改为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版本,但我不知道如何克服这个错误,所以任何帮助都将不胜感激!
发布于 2019-11-23 01:50:12
首先,你到底为什么要使用node来加载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/
您可能需要在亚马逊网络服务的node12内置运行时的基础上创建一个新的自定义运行时。
发布于 2020-03-07 15:31:02
简单的修复方法是在PHP代码之上添加:
set_include_path('/opt/lib64’);如果这不起作用,你需要自己编译/构建/安装缺失的模块/库:
1. Install docker.
2. In first terminal tab go to your lambda folder and start the lambda docker container:
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(请记住,层文件夹是以读/写权限挂载的)。
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');然后在Amazon Linux终端选项卡上安装/构建您的库,然后将其复制到文件夹:
cp /usr/lib64/[here is your library name] /opt/lib在Lambda container.
发布于 2020-06-01 14:14:12
我通过在函数的zip文件中添加额外的库文件夹来解决这个问题。
创建一个目录名extra-libs
使用以下步骤将所有必需的库从Amazon Linux 2复制到Extra-libs:
docker实例中的docker run --rm -it -v :/opt:rw,delegated amazonlinux:latest
使用mkdir deps
cp -f lib64/libcrypt.so.1 deps (以libcrypt.so.1为例,打开另一个终端窗口并将所有库文件移动到本地额外库
docker cp <DOCKER_CONTAINER_ID>:/deps/ . && mv deps/* ./extra-libs
使用docker ps获取容器id
然后在index.js文件中,将以下行添加到php的环境设置中。
LD_LIBRARY_PATH:path.join(__dirname, '/extra-libs')使用lambda函数压缩extra-libs文件夹并上传它。
希望这能有所帮助。
https://stackoverflow.com/questions/58996427
复制相似问题