AWS Lambda:Ruby函数无法加载gem

9
我有一个Ruby Lambda函数,依赖于外部(即非AWS)的RubyGem。我有一个Gemfile、一个Gemfile.lock和一个vendor/bundle目录。从本地角度来看,一切都很正常。
我尝试使用bundle install --path vendor/bundle和bundle install --deployment来安装gems,并在压缩文件时特别包括vendor目录:zip -r function.zip myfunction.rb vendor 尽管如此,在Lambda控制台测试函数时,它会因为找不到库而失败,例如:
{
  "errorMessage": "cannot load such file -- mysql2",
  "errorType": "Init<LoadError>",
  "stackTrace": [
    "/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
    "/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
    "/var/task/hello_ruby_record.rb:3:in `<top (required)>'",
    "/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
    "/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
  ]
}

我在上传函数之前打包宝石很可能做错了什么显而易见的事情;但我想不出是什么。有人有什么想法吗?


5
这可能是同样的问题吗?你本地的 Ruby 版本不是 2.5,因此正在另一个 Ruby 版本下打包。 - engineersmnky
看起来 gem 没有加载到 $LOAD_PATH 中 - https://dev59.com/olQJ5IYBdhLWcg3wiWec#53698808 - ryanjones
停下来,不再用头撞桌子了。是的,答案就在我面前 - 感谢两位指出来。这是一个捆绑问题。我的本地 Ruby 版本超过了 Lambda - 使用 RVM 显式设置 Ruby 版本可以解决这个问题。继续撞头... - TimD
2个回答

5

请确保您的捆绑配置完全如下:

BUNDLE_PATH: "vendor/bundle"

如果您只是遵循官方文件的说法:

要更新具有依赖项的Ruby函数:

  1. 使用bundle命令在vendor目录中安装库。
bundle config set --local path 'vendor/bundle' \ 
bundle install

你会得到一个冗余的尾随空格,这会搞乱事情:
BUNDLE_PATH: "vendor/bundle " <-- a trailing space here

我正在使用 ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-darwin19],并且没有任何问题。


疯狂但却是真的 - bundle config 命令末尾多了一个空格导致出现了问题。请注意! - Dan Garland

5
我遇到了相同的问题。根本原因是本地和Lambda函数中使用了不同版本的Ruby。目前AWS Lambda正在使用Ruby 2.5,而您的gems位于“/ vendor / bundle / ruby /”中。因此,您的Lambda函数无法定位您上传的gem库。为了使用您的Ruby版本覆盖gem路径,请在包含处理程序函数的文件顶部添加以下代码:
  my_gem_path = Dir["./vendor/bundle/ruby/<your-ruby-version>/gems/**/lib"]
  $LOAD_PATH.unshift(*my_gem_path)

或者,您可以尝试升级并匹配本地Ruby版本与Lambda函数使用的确切版本相同,目前为2.5。


即使是小版本也会出问题。(我用的是2.5.1) - ronnie bermejo
@TimD,你能把这个答案标记为已接受吗? - Abhishek Sinha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接