当前位置: 首页 > 知识库问答 >
问题:

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

敖硕
2023-03-14

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

我已经通过bundle install--部署安装了我的Ruby宝石,并将它们包含在我的部署中。当我在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。所以确实存在。

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

如果我上传一份libruby。因此到我的lambda,并将环境变量LD_LIBRARY_PATH设置到它的位置,并使用安装在AWS linux上的一组依赖项修复上面列出的错误,但只会给我一个更不透明的错误:

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

共有2个答案

澹台衡
2023-03-14

问题就如你所说的那样:原生扩展gem需要在运行时的相同环境中构建。因此,在将供应商上传到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

完整的图片列表如下:https://github.com/lambci/docker-lambda

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

希望这能让你少花几个小时在谷歌上搜索!

谢奇略
2023-03-14

在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。https://github.com/lambci/docker-lambda有lambda安装的docker图像。

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

  1. 构建docker ruby图像
  2. 将文件复制到原始目录中
  3. 从该目录运行:docker run-v“$PWD”:/var/task--entrypoint bundle lambci/lambda base:ruby2。5安装——路径=/var/task

这将为您提供一个名为ruby的文件夹,其版本依赖项与lambda兼容。

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

 类似资料:
  • 我一直在使用URLConnection。guessContentTypeFromName(String fname)来检测我需要在标头中使用什么mime类型来返回不同的文档。 在我用测试程序测试之前,它工作得很好 。我可以通过测试使它工作。jpg或测试。pdf,但不带测试。csv。 我没有问题获得pdf和jpg扩展的良好mimetype,但csv扩展接收null。 我似乎在谷歌上找不到任何理由来解

  • 我最近在Vuejs应用程序上安装了eslint。 已安装的软件包: My.eslintrc.json配置 当我试图在main.js文件中用var定义变量时,linter工作得很好,同时也显示了问题所在。 但当我尝试在.vue文件中执行相同操作时,它什么也没说。 好当时我以为Eslinter没有将其应用于.vue文件,但这里有点奇怪。。。 在var规则不起作用的同一个.vue文件中,eslint指出

  • 问题内容: 我在一个名为如下的应用程序中有一个模型: 在我的设置中: 但是,如果我尝试: 我收到以下错误: 我在这里想念什么? 任何帮助将非常感激。 问题答案: 嗯,您正在尝试获取UserProfile的用户个人资料。我希望您的意思是得到一个用户,然后再打电话。

  • 我正在将我的ColdFusion网站从CF-11迁移到CF-2018。我的网站上有ColdFusion代码。htm扩展名文件,即CF-11。现在我将我的网站转移到新的服务器上,它有CF-2018,但是。htm扩展无法在新服务器下工作。我已经在IIS下添加了处理程序映射。但它向我展示了这个错误 404-无法显示您试图访问的页面。请重试或通知管理员。 我还遵循了这里提到的步骤:IIS手动连接器配置 有

  • 我在一个网站上工作,遇到了一个问题,点击我的“删除”链接会出现一个错误页面。在localhost上运行良好-无法理解为什么在Heroku站点上会有所不同。 有人知道这是怎么回事吗? 我的“图片”控制器: 我的图片/新视图: 以下是我尝试删除图片时的heroku日志(从导航到新图片页面开始(同一视图中的新建和编辑功能): 2015-11-15T16:13:49.189857 00:00 heroku

  • 问题内容: 我正在尝试检测具有扩展名列表的文件。 问题答案: 为此使用元组。 不必每次都转换,只需将其转换为元组一次即可。