AWS Lambda:Ruby 函数无法加载 gem

Tim*_*imD 6 ruby rubygems amazon-web-services aws-lambda

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

我已经尝试使用bundle install --path vendor/bundlebundle 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'"
  ]
}
Run Code Online (Sandbox Code Playgroud)

据推测,在上传函数之前,我在捆绑宝石方面做了一些明显错误的事情;但我不知道是什么。有没有人有任何想法?

小智 5

我遇到了同样的问题。根本原因是本地函数和 Lambda 函数使用了不同的 ruby​​ 版本。目前,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)
Run Code Online (Sandbox Code Playgroud)

或者,尝试升级您的本地 Ruby 版本并将其与 Lambda 函数当前使用的确切版本(即 2.5)进行匹配。


小智 5

请确保您的捆绑配置正是这样:

BUNDLE_PATH: "vendor/bundle"
Run Code Online (Sandbox Code Playgroud)

如果你只是按照官方文档所说的去做:

使用依赖项更新 Ruby 函数

  1. 使用bundle 命令在供应商目录中安装库。
bundle config set --local path 'vendor/bundle' \ 
bundle install
Run Code Online (Sandbox Code Playgroud)

......

你会得到一个多余的尾随空格,这会让事情变得混乱:

BUNDLE_PATH: "vendor/bundle " <-- a trailing space here
Run Code Online (Sandbox Code Playgroud)

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