Impossible d'importer le module 'lambda_function': aucun module nommé *

Oct 12 2020

J'essaie d'exécuter une fonction lambda python qui utilise des packages supplémentaires. Cependant, chaque fois que je télécharge le fichier .zip sur la console lambda, j'obtiens l'erreur:

{
  "errorMessage": "Unable to import module 'lambda_function': No module named '*'",
  "errorType": "Runtime.ImportModuleError"
}

J'ai suivi ces instructions: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies qui m'a dit de m'assurer que mes paquets étaient dans un répertoire local de ma fonction lambda:

~/my-function$ pip install --target ./package Pillow

Je n'utilise pas Pillow. Ceci est un exemple de code de leur site. Je n'utilise pas non plus un package auquel vous pouvez déjà accéder sur Lambda. C'est celui que j'ai obtenu de github et que je dois attacher à mon application.

Au début, cela ne fonctionnait pas, j'ai donc créé un setup.cfgfichier et ajouté:

[install]
prefix= 

Maintenant, lorsque j'utilise la pipcommande pour installer sur la cible, cela fonctionne (et ajoute également des charges d'autres dossiers autres que mon package, mais j'ai supposé qu'ils étaient nécessaires, je les ai donc laissés là.

Quand je vais dans le répertoire, le paquet est là.

J'ai alors trouvé cette réponse: https://stackoverflow.com/a/12493244/5675125 ce qui suggérait peut-être que certains fichiers cachés n'étaient pas inclus et c'est ainsi que je devrais les compresser.

Encore une fois la même erreur.

Comment faire pour que lambda reconnaisse que mon colis est là.

Réponses

1 Marcin Oct 12 2020 at 10:28

Si vous avez besoin de Pillow, le moyen le plus simple de l'utiliser dans votre fonction consiste à utiliser un référentiel populaire avec des couches publiques (y compris un oreiller) comme keithrozario / Klayers sur github. Pour l'utiliser, vous devez localiser l'ARN de la couche en fonction de votre région . La liste des ARN pour python 3.8 est ici .

Par exemple, pour us-east-1la couche ajoutée pour Python 3.7 serait:

Mettre à jour

Je viens de créer le calque personnalisé avec instabotet je peux confirmer que cela fonctionne.

La technique utilisée comprend l' outil Docker décrit dans le récent blog AWS :

  • Comment créer une couche Lambda à l'aide d'un environnement Lambda simulé avec Docker?

Ainsi pour cette question, je l'ai vérifiée comme suit:

  1. Créez un dossier vide, par exemple mylayer.

  2. Accédez au dossier et créez un requirements.txtfichier avec le contenu de

instabot
  1. Exécutez la commande docker suivante:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. Supprimer numpy

Le instabotnécessite numpyqui est très grand. Nous le supprimons donc manuellement, avant de créer un calque. Nous allons utiliser la numpycouche fournie par AWS à la place.

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

Si nous ne supprimons pas numpy, la couche sera> 50 Mo.

  1. Créez un calque sous forme de zip:
zip -9 -r mylayer.zip python 
  1. Créez une couche lambda basée sur mylayer.zipdans la console AWS. N'oubliez pas de spécifier Compatible runtimesà python3.8.

  2. Ajoutez deux couches à votre fonction:

Le premier est AWSLambda-Python38-SciPy1xfourni par AWS avec numpy, tandis que le second est celui que nous avons créé ci-dessus. Ainsi, votre fonction utilisera deux couches.

  1. Testez la couche en lambda à l'aide de la fonction lambda suivante:
import json

from instabot import Bot

def lambda_handler(event, context):
    # TODO implement
    
    bot = Bot(base_path='/tmp')
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }