web-dev-qa-db-fra.com

Erreur du module AWS Lambda en python

Je crée un package de déploiement AWS Lambda python. J'utilise une demande de dépendance externe. J'ai installé la dépendance externe en utilisant la documentation AWS http://docs.aws.Amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html . Ci-dessous, mon code python. 

import requests

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        s3.download_file(bucket,key, '/tmp/data.txt')
        lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
        for line in lines:
            col=line.split(',')
            print(col[5],col[6])
        print("CONTENT TYPE: " + response['ContentType'])
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

Créé le Zip le contenu du répertoire project-dir et chargé sur le lambda (Zip le contenu du répertoire, pas le répertoire). Lorsque je suis en train d'exécuter la fonction, j'obtiens l'erreur mentionnée ci-dessous. 

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**

END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058  Duration: 19.63 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB

Aidez-moi à corriger l'erreur.

52
Nithin K Anil

L'erreur était due au nom de fichier de la fonction lambda. Lors de la création de la fonction lambda, il demandera un gestionnaire de fonction Lambda. Vous devez le nommer en tant que Python_File_Name.Method_Name. Dans ce scénario, je l'ai nommé lambda.lambda_handler (lambda.py est le nom du fichier). 

Veuillez trouver ci-dessous l'instantané.  enter image description here

72
Nithin K Anil

Si vous téléchargez un fichier Zip. Assurez-vous de compresser le contenu du répertoire et non le répertoire lui-même. 

33
2ank3th

Les autorisations sur le fichier compressé sont une autre source de ce problème. IlDOITêtre au moins lisible dans le monde entier. (min chmod 444)

J'ai exécuté ce qui suit sur le fichier python avant de le compresser et cela a bien fonctionné.

chmod u=rwx,go=r
19
Catalin Ciurea

J'ai trouvé la réponse de Nithin très utile. Voici un parcours spécifique:

Recherchez ces valeurs:

  1. Le nom de la fonction lambda_handler dans votre script python. Le name utilisé dans les exemples AWS est "lambda_handler", qui ressemble à ". L.wah like" def lambda_handler (event, context) ". Dans ce cas, la valeur est "Lambda_handler"
  2. Dans le tableau de bord Lambda, recherchez le nom du gestionnaire dans la zone de texte "Gestionnaire" de la section "Configuration" du tableau de bord lambda pour La fonction (affichée dans la capture d'écran de Nithin). Mon nom par défaut était "Lambda_function.lambda_handler".
  3. Le nom de votre script python. Disons que c'est "cool.py"

Avec ces valeurs, vous devrez renommer le gestionnaire (indiqué dans la capture d'écran) en "cool.lambda_handler". C'est un moyen de se débarrasser du message d'erreur «Impossible d'importer le module 'lambda_function'». Si vous deviez renommer le gestionnaire dans votre script python en "sup", vous devrez renommer le gestionnaire dans le tableau de bord lambda en "cool.sup".

11
user3303554

Il y a tellement de gotchas lors de la création de packages de déploiement pour AWS Lambda (pour Python). J'ai passé des heures et des heures en sessions de débogage jusqu'à ce que je trouve une formule qui échoue rarement.

J'ai créé un script qui automatise l'intégralité du processus et le rend donc moins sujet aux erreurs. J'ai aussi écrit un tutoriel qui explique comment tout fonctionne. Tu voudras peut-être vérifier: 

Déploiement Lambda Python sans tracas [Tutoriel + Script]

7
joarleymoraes

J'ai eu aussi l'erreur ..___ Il est maintenant apparu que mon fichier Zip incluait le dossier parent du code. Lorsque je unzip et inspecte le fichier Zip, le fichier lambda_function se trouve dans le dossier parent ./lambda.

Utilisez la commande Zip, corrigez l'erreur:

Zip -r ../lambda.Zip ./*
3
Joe

J'ai trouvé cela difficile après avoir essayé toutes les solutions ci-dessus. Si vous utilisez des sous-répertoires dans le fichier Zip, veillez à inclure le fichier __init__.py dans chacun des sous-répertoires et cela a fonctionné pour moi.

3
KApuri

Voici un petit pas en avant.

Supposons que vous avez un dossier appelé deploy, avec votre fichier lambda dans l'appel lambda_function.py. Supposons que ce fichier ressemble à quelque chose comme ça. (p1 et p2 représentent des packages tiers.)

import p1
import p2

def lambda_handler(event, context):
    # more code here

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }

Pour chaque dépendance vis-à-vis de tiers, vous devez utiliser pip install <third-party-package> --target . dans le dossier deploy.

pip install p1 --target .
pip install p2 --target .

Une fois cela fait, voici à quoi devrait ressembler votre structure.

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Enfin, vous devez Zip tout le contenu du dossier deploy dans un fichier compressé. Sur un Mac ou Linux, la commande ressemblerait à Zip -r ../deploy.Zip * dans le dossier deploy. Notez que l'indicateur -r est destiné aux sous-dossiers récursifs.

La structure du fichier fichier Zip doit refléter le dossier d'origine.

deploy.Zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Téléchargez le fichier Zip et spécifiez le <file_name>.<function_name> que Lambda doit entrer dans votre processus, tel que lambda_function.lambda_handler pour l'exemple ci-dessus.

1
openwonk

dans lambda_handler, le format doit être lambda_filename.lambda_functionName supposons que si vous voulez exécuter la fonction lambda_handler et si elle est dans lambda_fuction.py, votre formate de gestionnaire est "lambda_function.lambda_handler". les dépendances de modules sont une autre raison d’obtenir une erreur. votre lambda_fuction.py doit être dans le répertoire racine de Zip.

1
primit patel

@nithin, AWS a publié le concept layers à l'intérieur de fonctions Lambda. Vous pouvez créer votre couche et y télécharger autant de bibliothèques que vous pouvez ensuite la connecter aux fonctions lambda . Pour plus de détails: https://docs.aws.Amazon.com/lambda/latest /dg/configuration-layers.html

0
muTheTechie

Pas besoin de faire ce bazar.

utiliser python-lambda

https://github.com/nficano/python-lambda

avec la commande unique pylambda deployit déploiera automatiquement votre fonction

0
uzu

Vous devez compresser toutes les exigences, utilisez ce script

#!/usr/bin/env bash
rm package.Zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
Zip -r9 "../package.Zip" .
cd ..
rm -rf package

utiliser avec:

package.sh <python_file>
0
Uri Goren

Une perspective de 2019:

AWS Lambda prend désormais en charge Python 3.7, que de nombreuses personnes (y compris moi-même) choisissent d'utiliser comme environnement d'exécution pour les lambda en ligne.

Ensuite, j'ai dû importer une dépendance externe et j'ai suivi AWS Docs en tant que l'OP mentionné. (installation locale -> Zip -> upload).

J'ai eu une erreur de module d'importation et j'ai réalisé que mon PC local avait Python 2.7 par défaut. Lorsque j'ai appelé pip, il a installé ma dépendance pour Python 2.7.

J'ai donc basculé localement vers la version Python correspondant à la version d'exécution sélectionnée dans la console lambda, puis j'ai réinstallé les dépendances externes. Cela a résolu le problème pour moi. Par exemple.:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>
0
l001d

J'ai rencontré le même problème, c'était un exercice dans le cadre d'un tutoriel sur lynda.com si je ne me trompais pas. L’erreur que j’ai commise a été de ne pas sélectionner le moteur d’exécution en tant que Python 3.6, option disponible dans la console de fonction lamda.

0
Nadeem