AWS Lambda无法找到Ruby依赖关系

时间:2018-12-10 21:49:44

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

我正在研究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 installbundle 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'"
  ]
}

在该应用程序的现阶段,一切似乎都很简单,所以我对丢失的内容感到迷惑。有人对如何解决此问题有任何建议吗?

2 个答案:

答案 0 :(得分:2)

问题是Ruby版本之间不匹配。我比AWS Lambda的版本(2.5.0)落后几个版本。将本地版本更新为Labmda使用的版本后,加载错误就消失了。

此问题是AWS Lambda: Ruby function failing to load gemHow 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