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 à l'aide de la documentation AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html . Voici 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 téléchargé vers le lambda (Zip le contenu du répertoire, pas le répertoire). Lorsque j'exécute 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
Veuillez m'aider à déboguer l'erreur.
python
amazon-web-services
aws-lambda
Nithin K Anil
la source
la source
import lambda_function
qui ne soit pas trouvé. Tu veux peut-êtrefrom future import lambda_function
? Ou simplement pip installez lambda_function sur la ligne cmd.Réponses:
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 comme votre 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 le cliché.
la source
Si vous téléchargez un fichier zip. Assurez-vous que vous zippez le contenu du répertoire et non le répertoire lui-même.
la source
Les autorisations sur le fichier compressé sont une autre source de ce problème. Il DOIT ê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é.
la source
0600
qui, comme vous le mentionnez, ne suffit pas. De plus, l'éditeur de code source Lambda intégré (sur la page Web d'Amazon) lira volontiers le fichier sans avertissement des problèmes d'autorisations.J'ai trouvé la réponse de Nithin très utile. Voici une procédure pas à pas spécifique:
Recherchez ces valeurs:
Avec ces valeurs, vous devrez renommer le gestionnaire (montré dans la capture d'écran) en "cool.lambda_handler". C'est une façon 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 alors renommer le gestionnaire dans le tableau de bord lambda en "cool.sup"
la source
Il y a tellement de pièges lors de la création de packages de déploiement pour AWS Lambda (pour Python). J'ai passé des heures et des heures sur des sessions de débogage jusqu'à ce que je trouve une formule qui échoue rarement.
J'ai créé un script qui automatise l'ensemble du processus et le rend donc moins sujet aux erreurs. J'ai également écrit un tutoriel qui explique comment tout fonctionne. Tu voudras peut-être vérifier:
Déploiement sans tracas de Python Lambda [Tutoriel + Script]
la source
Voici une étape rapide.
Supposons que vous ayez un dossier appelé
deploy
, avec votre fichier lambda à l'intérieur de l'appellambda_function.py
. Supposons que ce fichier ressemble à quelque chose comme ça. (p1
etp2
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 tierce, vous devez
pip install <third-party-package> --target .
partir dudeploy
dossier.Une fois que vous avez fait cela, voici à quoi devrait ressembler votre structure.
Enfin, vous devez transformer
zip
tout le contenu dudeploy
dossier dans un fichier compressé. Sur un Mac ou Linux, la commande ressemblerait à cellezip -r ../deploy.zip *
dudeploy
dossier. Notez que l'-r
indicateur est pour les sous-dossiers récursifs.La structure du fichier zip doit refléter le dossier d'origine.
Téléchargez le fichier zip et spécifiez
<file_name>.<function_name>
pour Lambda à entrer dans votre processus, comme danslambda_function.lambda_handler
l'exemple ci-dessus.la source
zip -r deploy.zip deploy
. Cela créera un dossier de déploiement dans le fichier zip.J'ai trouvé ce moyen difficile après avoir essayé toutes les solutions ci-dessus. Si vous utilisez des sous-répertoires dans le fichier zip, assurez-vous d'inclure le
__init__.py
fichier dans chacun des sous-répertoires et cela a fonctionné pour moi.la source
J'ai eu l'erreur aussi. Il s'avère que mon fichier zip comprend le dossier parent de code. Lorsque
unzip
j'inspecte le fichier zip, lelambda_function
fichier est sous le dossier parent./lambda
.Utilisez la
zip
commande, corrigez l'erreur:zip -r ../lambda.zip ./*
la source
Dans
lambda_handler
le format doit êtrelambda_filename.lambda_functionName
. Supposons que vous souhaitiez exécuter lalambda_handler
fonction et qu'elle soitlambda_fuction.py
active, le format de votre gestionnaire estlambda_function.lambda_handler
.Une autre raison pour obtenir cette erreur est les dépendances de module.
Votre
lambda_fuction.py
doit être dans le répertoire racine du fichier zip.la source
@nithin, AWS a publié un
layers
concept à l'intérieur desLambda
fonctions. Vous pouvez créer votre couche et là, vous pouvez télécharger autant que des bibliothèques, puis vous pouvez connecter la couche avec les fonctions lambda. Pour plus de détails: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.htmlla source
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 lambdas en ligne.
Ensuite, j'ai dû importer une dépendance externe et j'ai suivi AWS Docs en tant qu'OP désigné. (installation locale -> zip -> téléchargement).
J'ai eu l'erreur de module d'importation et j'ai réalisé que mon PC local avait Python 2.7 comme Python 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 qui correspond à la version d'exécution sélectionnée dans la console lambda, puis réinstallé les dépendances externes. Cela a résolu le problème pour moi. Par exemple:
la source
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 trompe pas. L'erreur que j'ai commise a été de ne pas sélectionner le runtime comme Python 3.6 qui est une option dans la console de fonction lamda.
la source
Le problème ici que la version Python utilisée pour créer vos dépendances de fonction Lambda (sur votre propre machine) est différente de la version Python sélectionnée pour votre fonction Lambda. Ce cas est courant en particulier si la bibliothèque Numpy fait partie de vos dépendances.
Exemple: la version python de votre machine: 3.6 ---> Lambda python version 3.6
la source
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:
la source
Partager ma solution pour le même problème, juste au cas où cela aiderait quelqu'un.
Problème: j'ai eu une erreur: "[ERROR] Runtime.ImportModuleError: Impossible d'importer le module 'lambda_function': aucun module nommé 'StringIO'" lors de l'exécution du code aws-big-data-blog [1] fourni dans l'article AWS [2].
Solution: Runtime changé de Python 3.7 à Python 2.7
[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // aws .amazon.com / blogs / big-data / analyse-vpc-flow-logs-avec-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /
la source
Vous pouvez configurer votre fonction Lambda pour extraire du code et du contenu supplémentaires sous la forme de couches. Une couche est une archive ZIP contenant des bibliothèques, un environnement d'exécution personnalisé ou d'autres dépendances. Avec les couches, vous pouvez utiliser des bibliothèques dans votre fonction sans avoir besoin de les inclure dans votre package de déploiement. Les couches vous permettent de réduire la taille de votre package de déploiement, ce qui facilite le développement.
Références:-
la source
Assurez-vous que vous zippez toutes les dépendances dans une structure de dossiers en tant que python / [Vos dépendances] pour que cela fonctionne conformément à cette documentation.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
la source
Mon problème était que le fichier .py et les dépendances n'étaient pas dans le répertoire «racine» du zip. Par exemple, le chemin des bibliothèques et de la fonction lambda .py doit être:
ne pas
/foo/bar/<name of library>/foo2/bar2
Par exemple:
drwxr-xr-x 3.0 unx 0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/ -rw-r--r-- 3.0 unx 192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc -rw-r--r-- 3.0 unx 758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc -rw-r--r-- 3.0 unx 965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc -rw-r--r-- 3.0 unx 7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py
la source
En fait, allez dans le dossier principal (package de déploiement) que vous souhaitez compresser,
Dans ce dossier, sélectionnez tous les fichiers, puis créez le zip et téléchargez ce zip
la source
Veuillez ajouter ci-dessous un après
Import requests
import boto3
Ce que je peux voir qui manque dans votre code.
la source
Pas besoin de faire ce bordel.
utiliser python-lambda
https://github.com/nficano/python-lambda
avec une seule commande,
pylambda deploy
il déploiera automatiquement votre fonctionla source