Как я могу получить AWS Lambda для доступа к драгоценным камням, хранящимся в вендоре / комплекте? - PullRequest
0 голосов
/ 05 декабря 2018

Я пишу лямбда-функцию в Ruby, которая в конечном итоге отправит мне некоторые уведомления в Slack через Webhook.Итак, что у меня есть для lambda_function файла

require 'json'
require 'webhook'

def lambda_handler(event:, context:)
    # TODO implement
    { statusCode: 200, body: JSON.generate('Hello from Lambda!') }
    Webhook.post('https://mywebhookurl', {message: 'test'})
end

И структура каталогов в моем редакторе встроенного кода выглядит следующим образом:

Gemfile
Gemfile.lock
lambda_function.rb
vendor/
  bundle/
    ruby
      2.3.0
        gems/webhook

также под ванной 2.3.0несколько других папок, включая build_info, cache, doc и т. д. Чтобы загрузить этот код в AWS Lambda, я запускаю

zip -r myLambda.zip *, чтобы получить все в zip-файл и загрузить вЛямбда.

Однако, когда я наконец запускаю базовый тест для лямбды, я получаю следующую ошибку:

{
  "errorMessage": "cannot load such file -- webhook",
  "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/lambda_function.rb:2: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'"
  ]
}

Больше не должно быть этого, поскольку следующий урок показывает, как именно настроить то, что у меня есть, но не работает.У кого-нибудь есть успех в извлечении драгоценных камней из их гемфайла в AWS Lambda?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я столкнулся с той же проблемой при создании AWS Lambda Layers с Ruby.Быстрый и простой способ заставить это работать - добавить все пути к гемам в $ LOAD_PATH Руби в вашей AWS Lambda.IE:

load_paths = Dir["/opt/ruby/gems/2.5.0/**/lib"]
$LOAD_PATH.unshift(*load_paths)

require 'webhook'

Замените "/opt/ruby/gems/2.5.0/**/lib" на "./vendor/bundle/ruby/2.3.0/gems/**/lib" в вашем случае.

Когда вы сделаете require 'webhook', он пойдет, просмотрит все пути и встретит "./vendor/bundle/ruby/2.3.0/gems/webhook-1.0.0/lib/webhook.rb" и добавьте его в свою AWS Lambda.require не требует расширения файла.

Когда мы запускаем rails через bundler, он делает для нас кучу «волшебства», включая проверку того, что наш $ LOAD_PATH указывает на драгоценные камни.Так как AWS Lambdas не использует упаковщик, нам нужно сделать часть этой «магии» самостоятельно.

0 голосов
/ 05 декабря 2018

Вы должны убедиться, что версия Ruby, которую вы использовали локально для комплектации, соответствует версии, используемой Lambda.

Похоже, что в вашем zip установлены гемы в 2.3.0, а в списке трассировок стека 2.5.0.Это несовпадение означает, что лямбда-бегун не может найти ваши драгоценные камни.

...