我有一个 ruby 脚本,正在尝试在 AWS Lambda 上运行。我如何让它使用带有本机扩展的 Ruby gem?
我已经通过安装了我的 Ruby gemsbundle install --deployment
并将它们包含在我的部署中。当我在 lambda 上运行该函数时,出现错误:
忽略 oj-2.18.5,因为它的扩展尚未构建。尝试:gem pristine oj --version 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.so
确实存在。
我已经尝试过使用生成的文件bundle install
在 Ubuntu 和 AWS-linux 上。在这两个系统上,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 需要)
Running ldd
gems/oj-2.18.5/lib/oj/oj.so 澄清了第一个错误。问题不在于oj.so
不存在,但是libruby.so.2.5
不存在。第二个问题是当前的 Ruby lambda 具有 glibc 版本 2.17,而 AWS-linux 附带 glibc 版本 2.25。
这里的根本问题是,如果您有本机依赖项,您需要将 gems 安装在与它们将运行的系统相同的系统上。我发现做到这一点的最好方法是使用 docker。https://github.com/lambci/docker-lambda https://github.com/lambci/docker-lambda有 lambda 安装的 docker 镜像。
对于红宝石,请执行以下操作:
- 构建 docker ruby 镜像
- 将您的 gemfile 复制到原始目录中
- 从该目录运行:
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/...
在您上传之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)