我正在研究announcing-ruby-support-for-aws-lambda中的教程,但无法让Lambda定位Ruby依赖项。
我已经在其中复制/粘贴了本教程的代码。到目前为止还没有幻想。
require 'aws-record'
class DemoTable
include Aws::Record
set_table_name ENV[‘DDB_TABLE’]
string_attr :id, hash_key: true
string_attr :body
end
def put_item(event:,context:)
body = event["body"]
item = DemoTable.new(id: SecureRandom.uuid, body: body)
item.save! # raise an exception if save fails
item.to_h
end
我有一个包含aws-record
的Gemfile,并且我同时运行了bundle install
和bundle install --deployment
。
如果我在Lambda控制台中,请查看“功能代码”部分,我可以看到该项目具有供应商目录,并且存在aws-record
gem。
我已经使用sam
CLI打包和部署了代码,并且看起来一切正常。
但是当我创建并运行测试时,收到以下错误。
{
"errorMessage": "cannot load such file -- aws-record",
"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:1: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'"
]
}
在该应用程序的现阶段,一切似乎都很简单,所以我对丢失的内容感到迷惑。有人对如何解决此问题有任何建议吗?
答案 0 :(得分:2)
问题是Ruby版本之间不匹配。我比AWS Lambda的版本(2.5.0)落后几个版本。将本地版本更新为Labmda使用的版本后,加载错误就消失了。
此问题是AWS Lambda: Ruby function failing to load gem和How can I get my AWS Lambda to access gems stored in vendor/bundle?的重复,但是目前,这两个都没有接受答案,因此我将其留在此处,供以后类似情况的开发者使用。
答案 1 :(得分:0)
您不需要将本地Ruby版本与AWS Ruby版本匹配。相反,您可以通过以下方式利用Docker来供应2.5.0 gem:
cd /path/to/Gemfile/ && \
docker run -v `pwd`:`pwd` -w `pwd` -i -t lambci/lambda:build-ruby2.5 bundle install --deployment