【问题标题】:AWS Lambda with php.handler node 12.x error - SOLVED带有 php.handler 节点 12.x 错误的 AWS Lambda - 已解决
【发布时间】:2020-06-01 14:14:12
【问题描述】:

更新:谢谢大家!我通过为我的 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 node.js amazon-web-services aws-lambda


    【解决方案1】:

    首先,你到底为什么要使用 node 来加载 php?

    但是如果你之前有这个工作,为什么你需要更新到节点 12?

    如果您从 Node 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 内置运行时创建新的自定义运行时。

    【讨论】:

      【解决方案2】:

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

      set_include_path('/opt/lib64’);
      

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

      • 运行两个装载相同“本地”层文件夹的 docker 实例。
      • 第一个容器将是您的 lambda 容器,而第二个容器是用于构建项目的 Amazon linux。
      • 使用 Lambda 容器测试您的代码,如果缺少某些内容,请切换到 Amazon Linux 并将二进制文件/库构建/提取到共享层文件夹结构中。
      • 确保 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 层结构的内容,请记住,您的 \bin 或 \lib 文件夹需要位于 zip 文件的根文件夹中。
      3. 将 zip 文件添加为您的 lambda 图层并附加它。

      【讨论】:

        【解决方案3】:

        我通过在函数的 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获取容器id

        然后在 index.js 文件中,将以下行添加到 php 的 env 设置中。

        LD_LIBRARY_PATH:path.join(__dirname, '/extra-libs')
        

        使用您的 lambda 函数压缩 extra-libs 文件夹并上传。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2021-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-06
          • 1970-01-01
          • 2018-04-12
          • 2018-06-04
          相关资源
          最近更新 更多