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.
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).
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.
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
J'ai trouvé la réponse de Nithin très utile. Voici un parcours spécifique:
Recherchez ces valeurs:
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".
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:
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 ./*
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.
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.
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.
@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
Pas besoin de faire ce bazar.
utiliser python-lambda
https://github.com/nficano/python-lambda
avec la commande unique pylambda deploy
it déploiera automatiquement votre fonction
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>
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>
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.