首页 > 解决方案 > 带有 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 版本,但我不知道如何克服这个错误,所以任何帮助将不胜感激!

标签: phpnode.jsamazon-web-servicesaws-lambda

解决方案


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

set_include_path('/opt/lib64’);

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

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

    1. 安装泊坞窗。
    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 代码中:</li>
set_include_path('/opt/lib');
  1. 然后在 Amazon Linux 终端选项卡上安装/构建您的库,然后将其复制到层文件夹:
cp /usr/lib64/[here is your library name] /opt/lib
  1. 在 Lambda 容器中再次测试您的代码。
  2. 完成后,只需压缩 Lambda 层结构的内容,请记住,您的 \bin or \lib 文件夹需要位于 zip 文件的根文件夹中。
  3. 将 zip 文件添加为您的 lambda 图层并附加它。

推荐阅读