带有本机扩展的Ruby gem不适用于AWS Lambda
我有一个ruby脚本,我正试图在AWS Lambda上运行。我如何使用带有本机扩展的Ruby gem 我已经通过带有本机扩展的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:无法打开共享对象文件:没有这样的文件或目
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 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完全相同的问题,所以我认为这可能对某些人有用
希望这能让你从谷歌搜索中解脱出来