Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有本机扩展的Ruby gem不适用于AWS Lambda_Ruby_Amazon Web Services_Aws Lambda_Rubygems - Fatal编程技术网

带有本机扩展的Ruby gem不适用于AWS Lambda

带有本机扩展的Ruby gem不适用于AWS Lambda,ruby,amazon-web-services,aws-lambda,rubygems,Ruby,Amazon Web Services,Aws Lambda,Rubygems,我有一个ruby脚本,我正试图在AWS Lambda上运行。我如何使用带有本机扩展的Ruby gem 我已经通过bundle install--deployment安装了Ruby gems,并将它们包括在我的部署中。当我在lambda上运行函数时,我得到错误: 忽略oj-2.18.5,因为未构建其扩展。Try:gem pristine oj——版本2.18.5 加载处理程序时发生初始化错误 { “errorMessage”:“libruby.so.2.5:无法打开共享对象文件:没有这样的文件或目

我有一个ruby脚本,我正试图在AWS Lambda上运行。我如何使用带有本机扩展的Ruby gem

我已经通过
bundle install--deployment
安装了Ruby gems,并将它们包括在我的部署中。当我在lambda上运行函数时,我得到错误:

忽略oj-2.18.5,因为未构建其扩展。Try:gem pristine oj——版本2.18.5

加载处理程序时发生初始化错误

{

“errorMessage”:“libruby.so.2.5:无法打开共享对象文件:没有这样的文件或目录-/opt/ruby/gems/2.5.0/gems/oj-2.18.5/lib/oj/oj.so”

我已经尝试在lambda代码本身和lambda层中包含依赖项。唯一改变的是错误消息中的路径

Lambda能够找到我的红宝石。当它们在错误的位置时,我会得到不同的错误

/opt/ruby/gems/2.5.0/gems/oj-2.18.5/lib/oj/oj。因此
确实存在

我已经在Ubuntu和AWS linux上用
bundle install
生成的文件尝试过了。在这两个系统上,bundle都告诉我它正在“安装带有本机扩展名的oj 2.18.5”

如果我将
libruby.so
的副本上载到我的lambda,并将环境变量
LD_LIBRARY_PATH
设置到它的位置,并使用AWS linux上安装的依赖项集修复上面列出的错误,但只会给我一个更不透明的错误:

/lib64/libc.so.6:找不到版本'GLIBC_2.25'(由/opt/ruby/lib/libruby.so.2.5所需)


在gems/oj-2.18.5/lib/oj/oj.so上运行
ldd
,澄清了第一个错误。问题不在于
oj.so
不存在,而在于
libruby.so.2.5
不存在。第二个问题是当前的Ruby lambda有glibc版本2.17,AWS linux附带glibc版本2.25

这里最基本的问题是,如果您有本机依赖项,您需要将gems安装在与它们将运行的系统相同的系统上。我发现最好的方法是使用docker。安装lambda的docker映像

对于ruby,请执行以下操作:

  • 构建docker ruby映像
  • 将文件复制到原始目录中
  • 从该目录运行:
    docker run-v“$PWD”:/var/task--entrypoint bundle lambci/lambda base:ruby2.5 install--path=/var/task
  • 这将为您提供一个名为
    ruby
    的文件夹,其版本依赖项与lambda兼容


    如果您计划将此输出用于lambda层,请记住,bunlde生成的文件结构是
    ruby/2.5.0/..
    ,在上载之前,它需要是
    ruby/gems/2.5.0/..

    问题正是您所说的,概括起来:本机扩展gems需要在相同的环境中构建因此,在将供应商上传到aws之前,我们必须在与lambda类似的环境中安装gems


    要以符合lambda的方式构建供应商/捆绑包,请使用以下docker容器:

    docker run --rm -v "$PWD":/var/task lambci/lambda:build-ruby2.7 bundle install --deployment
    
    这将为您提供一个有效的供应商/捆绑依赖关系

    您可以运行另一个容器来检查函数是否工作:

    docker run --rm -v $PWD:/var/task:ro,delegated lambci/lambda:ruby2.7 lambda_handler.lambda_handler
    
    完整的图像列表如下所示:

    这个问题已经有1年历史了,但我必须搜索大约2个小时来解决与宝石nokogiri完全相同的问题,所以我认为这可能对某些人有用

    希望这能让你从谷歌搜索中解脱出来