我正在本地运行AWS Lambda。
当我运行lambda函数时,这是我得到的错误:
{
"errorMessage": "cannot load such file -- nokogiri/nokogiri",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:15:in `rescue in <top (required)>'",
"/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:11:in `<top (required)>'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/task/vendor/ruby/2.7.0/gems/google_drive-3.0.5/lib/google_drive/session.rb:8:in `<top (required)>'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/task/vendor/ruby/2.7.0/gems/google_drive-3.0.5/lib/google_drive.rb:7:in `<top (required)>'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/task/main.rb:7:in `<top (required)>'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
"/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'"
]
}
我查看了/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:15
,这是让一切都崩溃的代码:"require"nokogiri/nokogiri">
这些是`中的文件/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib':
nokogiri
nokogiri.rb
xsd
这些是./vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri/
:中的文件
css
decorators
html.rb
nokogiri.bundle
version.rb
xml.rb
xslt.rb
css.rb
html
jruby
syntax_error.rb
xml
xslt
没有文件nokogiri/nokogiri
,因此我认为出现了错误。我试图将nokogiri.rb
复制到目录nokogiri
中,但出现了其他错误。
我该如何前进?
谢谢!
在阅读本文之前,我一直面临着同样的问题https://www.stevenringo.com/ruby-in-aws-lambda-with-postgresql-nokogiri/。
总之,问题是在使用AWS Lambda时,无法在environment/Lambda上执行命令。因此,虽然您可以在本地使用bundle install
,但在Lambda上不能使用它。话虽如此,正如文章所提到的,we need to find a way to package and compile dependencies ahead of time in an environment that is compatible with the Lambda environment.
这使我们找到了另一种解决方案,即从docker容器编译依赖项以匹配lambda环境。为了解决这个问题,您需要执行以下操作:
-
在本地机器上安装docker
-
使用以下行在ruby项目中创建
Dockerfile
:FROM lambci/lambda:build-ruby2.7 CMD "/bin/bash"
-
使用以下命令构建docker映像:
docker build -t lambda-ruby2.7 .
(不要忘记末尾的句点!( -
使用以下命令在容器中输入shell:
docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.7
-
从shell/容器运行
bundle install --path vendor/bundle --clean
-
退出外壳
-
在项目内部,压缩它:
zip -q -r deploy.zip .
这个解决方案对我很有效。希望它能成为一个替代方案,直到有人想出如何在不使用Docker的情况下做到这一点。