AWS Lambda:Ruby函数无法加载gem

时间:2018-12-07 16:32:25

标签: ruby amazon-web-services rubygems aws-lambda

我有一个Ruby Lambda函数,该函数取决于外部(即非AWS)的RubyGem。我有一个Gemfile,一个Gemfile.lock和一个vendor/bundle目录。从本地角度看一切都很好。

我尝试使用bundle install --path vendor/bundlebundle install --deployment安装gem,并且在压缩文件时特别包含了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'"
  ]
}

大概是我在上传函数之前捆绑宝石时确实做错了什么;但我不知道是什么。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。根本原因是在本地和Lambda函数中使用的红宝石版本不同。当前,AWS Lambda使用的是Ruby 2.5,而您的gem位于“ / 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函数viz 2.5当前使用的确切版本匹配。