带有php.handler节点12.x的AWS Lambda错误

时间:2019-11-22 14:35:39

标签: php node.js amazon-web-services aws-lambda

我目前正在将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版本,但是我不知道如何克服此错误,因此我们将不胜感激!

3 个答案:

答案 0 :(得分:1)

简单的解决方法是在您的PHP代码之上添加:

set_include_path('/opt/lib64’);

如果这行不通,则需要您自己编译/构建/安装缺少的模块/库:

  • 运行两个将安装相同“本地” Layer文件夹的docker实例。
  • 第一个容器将是您的lambda容器,而第二个是用于构建项目的Amazon linux。
  • 使用Lambda容器测试代码,以防万一缺少某些内容,请切换到Amazon Linux,并将二进制文件/库构建/提取到共享的Layer文件夹结构中。
  • 确保Lambda代码已定义正确的PATH以使用Layer文件夹。

    1. 安装docker。
    2. 在第一个终端选项卡中,转到您的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
  1. 在第二个终端选项卡中,使用Amazon linux运行另一个容器:
docker run --rm -it -v /your/path/to/Layer/folder/:/opt:rw,delegated amazonlinux:latest

(请记住,Layer文件夹已安装为具有读/写权限)。

  1. 以您喜欢的方式或通过简单的运行来测试您的lambda代码(请确保检查您的处理程序模块名称是“ handler”,文件名是“ index.js”):

cd /var/task
node index.js; node "var func = require('./index.js');func.handler({},function() {},function(){console.log('Lambda finished')});"
  1. 如果您发现某些缺少的库,请确保将其添加到您的PHP代码中:
set_include_path('/opt/lib');
  1. 然后在Amazon Linux终端选项卡上,安装/构建您的库,然后将其复制到Layer文件夹:
cp /usr/lib64/[here is your library name] /opt/lib
  1. 再次在Lambda容器中测试您的代码。
  2. 完成后,只需压缩Lambda Layer结构的内容,请记住\ bin ora \ lib文件夹需要位于zip文件的根文件夹中。
  3. 将zip文件添加为lambda的图层并附加。

答案 1 :(得分:1)

我通过在函数的zip中添加额外的库文件夹来解决此问题。

命名为extra-libs

使用以下步骤将所有必需的库从Amazon Linux 2复制到Extra-libs

  1. 通过以下命令运行Amazon Linux 2的docker实例

    docker run --rm -it -v :/opt:rw,delegated amazonlinux:latest

  2. 然后在docker实例的make目录中使用

    mkdir deps

  3. 使用

    将所有必需的库从lib64复制到deps目录

    cp -f lib64/libcrypt.so.1 deps(以libcrypt.so.1为例)

  4. 然后打开另一个终端窗口,并将所有库文件移至本地Extra-libs

    docker cp <DOCKER_CONTAINER_ID>:/deps/ . && mv deps/* ./extra-libs

    使用docker ps

  5. 获取容器ID

然后在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内置运行时来创建新的自定义运行时。