首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有php.handler节点12.x的AWS Lambda错误已解决

具有php.handler节点12.x的AWS Lambda错误已解决
EN

Stack Overflow用户
提问于 2019-11-22 22:35:39
回答 3查看 584关注 0票数 1

更新:谢谢大家!我已经解决了这个问题,为我的PHP Lambda创建了一个自定义的运行时。

我当前使用的是带有php.handler的Node.js 8.10运行时,我的Lambda函数运行良好,但当我将运行时更改为12.x时,我得到以下错误:

"php-7-bin/bin/php:加载共享库时出错: libcrypt.so.1:无法打开共享目标文件:没有这样的文件或目录“

代码语言:javascript
复制
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版本,但我不知道如何克服这个错误,所以任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

发布于 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内置运行时的基础上创建一个新的自定义运行时。

票数 1
EN

Stack Overflow用户

发布于 2020-03-07 15:31:02

简单的修复方法是在PHP代码之上添加:

代码语言:javascript
复制
set_include_path('/opt/lib64’);

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

  • 运行两个docker实例,这两个实例将装载相同的“本地”层文件夹。
  • 第一个容器将是您的lambda容器,第二个容器是用于构建项目的Amazon linux。
  • 使用Lambda容器测试您的代码,如果缺少某些内容,请切换到Amazon Linux并将二进制文件/库构建/解压缩到共享层文件夹structure.
  • Make中,确保Lambda代码具有正确的路径定义以使用层文件夹。

代码语言:javascript
复制
1. Install docker.
2. In first terminal tab go to your lambda folder and start the lambda docker container:

代码语言:javascript
复制
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运行另一个容器:

代码语言:javascript
复制
docker run --rm -it -v /your/path/to/Layer/folder/:/opt:rw,delegated amazonlinux:latest

(请记住,层文件夹是以读/写权限挂载的)。

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

代码语言:javascript
复制

cd /var/task
node index.js; node "var func = require('./index.js');func.handler({},function() {},function(){console.log('Lambda finished')});"

  1. 如果您发现一些缺少的库,请确保在您的PHP代码中添加:

代码语言:javascript
复制
set_include_path('/opt/lib');

然后在Amazon Linux终端选项卡上安装/构建您的库,然后将其复制到文件夹:

代码语言:javascript
复制
cp /usr/lib64/[here is your library name] /opt/lib

在Lambda container.

  • When中再次测试您的代码您只需压缩Lambda层结构的内容,请记住,您的\
  1. \lib文件夹需要位于压缩文件的根文件夹中。
  2. 为您的Lambda添加压缩文件作为图层并附加它。
票数 1
EN

Stack Overflow用户

发布于 2020-06-01 14:14:12

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

创建一个目录名extra-libs

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

  1. 通过以下命令运行amazon Linux2的docker实例

docker实例中的docker run --rm -it -v :/opt:rw,delegated amazonlinux:latest

  • Then使用make目录

使用mkdir deps

  • Copy命令将所有必需的库从lib64保存到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的环境设置中。

代码语言:javascript
复制
LD_LIBRARY_PATH:path.join(__dirname, '/extra-libs')

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

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58996427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档