Tim*_*imD 6 ruby rubygems amazon-web-services aws-lambda
我有一个 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'"
]
}
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 函数
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]并且它工作没有问题。
| 归档时间: |
|
| 查看次数: |
3562 次 |
| 最近记录: |