web-dev-qa-db-fra.com

Comment puis-je obtenir mon AWS Lambda pour accéder aux gemmes stockées dans le fournisseur / bundle?

J'écris une fonction Lambda en Ruby qui finira par m'envoyer des notifications dans Slack via Webhook. Donc ce que j'ai pour mon lambda_function le fichier est

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

Et la structure du répertoire dans mon éditeur de code en ligne ressemble à ceci:

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

également sous le 2.3.0 bath contient plusieurs autres dossiers, dont build_info, cache, doc etc. Afin d'obtenir ce code sur AWS Lambda, j'exécute

Zip -r myLambda.Zip * pour tout mettre dans un fichier Zip et téléchargé sur Lambda.

Cependant, lorsque je vais enfin exécuter un test de base sur le lambda, j'obtiens l'erreur suivante:

{
  "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'"
  ]
}

Il ne devrait plus y en avoir car le tutoriel suivant montre exactement comment configurer ce que j'ai, mais ne fonctionne pas. Quelqu'un a-t-il réussi à extraire des gemmes de leur fichier de gemmes dans AWS Lambda?

10
Csteele5

J'ai rencontré ce même problème lors de la création de couches AWS Lambda avec Ruby. Un moyen rapide et facile pour que cela fonctionne est d'ajouter tous les chemins de gemme à $ LOAD_PATH de Ruby dans votre AWS Lambda. C'EST À DIRE:

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

require 'webhook'

Remplacer "/opt/Ruby/gems/2.5.0/**/lib" avec "./vendor/bundle/Ruby/2.3.0/gems/**/lib" dans ton cas.

Quand vous faites require 'webhook' ça va aller voir tous les chemins et tomber "./vendor/bundle/Ruby/2.3.0/gems/webhook-1.0.0/lib/webhook.rb" et ajoutez-le à votre AWS Lambda. require ne nécessite pas d'extension de fichier.

Lorsque nous exécutons Rails via bundler, cela fait un tas de 'magie' pour nous, notamment en nous assurant que notre $ LOAD_PATH pointe vers les joyaux. Comme AWS Lambdas n'utilise pas de bundler, nous devons faire une partie de cette "magie" nous-mêmes.

13
ryanjones

Vous devez vous assurer que la version de Ruby que vous avez utilisée localement pour regrouper correspond à la version utilisée par Lambda.

Votre Zip semble avoir les gemmes installées dans 2.3.0 mais votre trace de pile répertorie 2.5.0. Cette incompatibilité signifie que le coureur lambda ne peut pas trouver vos gemmes.

9
Casao