J'ai essayé d'exécuter mon code dans AWS Lambda, qui importe des pandas. Alors voici ce que j'ai fait. J'ai un fichier python qui contient un code simple, comme suit (ce fichier contient le gestionnaire lambda)
import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
return "Welcome to Pandas usage in AWS Lambda"
Mais lorsque je teste la fonction lambda dans AWS Lambda, j'obtiens l'erreur ci-dessous:
Unable to import module 'lambda_function': Missing required dependencies ['numpy']
J'ai déjà numpy dans le paquet compressé mais j'obtiens toujours cette erreur. J'ai essayé de suivre les indications données à Pandas & AWS Lambda mais pas de chance.
Quelqu'un at-il rencontré le même problème? Apprécierait toute suggestion ou suggestion pour résoudre ce problème.
Merci
EDIT: J'ai enfin trouvé comment exécuter pandas & numpy dans un environnement d’exécution AWS Lambda python 3.6.
J'ai téléchargé mon package de déploiement sur le référentiel suivant:
git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git
Ajoutez simplement votre lambda_function.py
au fichier Zip en lançant:
Zip -ur lambda.Zip lambda_function.py
Transférer sur S3 et source sur lambda.
ORIGINAL:
La seule façon dont j'ai obtenu Pandas de travailler dans une fonction lambda est de compiler les bibliothèques pandas (et numpy) dans une instance AWS Linux EC2 en suivant les étapes de cet article de blog puis en utilisant le runtime python 2.7) pour ma fonction lambda.
Pour inclure numpy dans votre lambda Zip, suivez les instructions de cette page dans la documentation AWS ...
Pour paraphraser les instructions en utilisant numpy comme exemple:
Choisissez Télécharger les fichiers.
Télécharger:
Pour Python 2.7, nom-module-version-cp27-cp27mu-manylinux1_x86_64.whl
par exemple. numpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl
Pour Python 3.6, nom-module-version-cp36-cp36m-manylinux1_x86_64.whl
par exemple. numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl
unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl
Lorsque le fichier wheel est décompressé, votre package de déploiement sera compatible avec Lambda.
J'espère que tout a du sens;)
Le résultat final pourrait ressembler à quelque chose comme ça. Remarque: vous ne devez pas inclure le fichier whl dans le package de déploiement.
Après de nombreuses recherches, j'ai pu le faire fonctionner avec des couches Lambda.
Créez ou ouvrez un répertoire vierge et suivez les étapes ci-dessous:
Prérequis : Assurez-vous que Docker est opérationnel.
pandas==0.23.4 pytz==2018.7
#!/bin/bash export PKG_DIR="python" rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR} docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \ pip install -r requirements.txt --no-deps -t ${PKG_DIR}
chmod +x get_layer_packages.sh ./get_layer_packages.sh Zip -r pandas.Zip .
Chargez le calque dans un compartiment S3.
Téléchargez la couche sur AWS en exécutant la commande ci-dessous:
aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer" --content S3Bucket*=<bucket name>*,S3Key=*<layer-name>*.Zip --compatible-runtimes python3.6 python3.7
Accédez à la console Lambda et téléchargez votre code sous forme de fichier Zip ou utilisez l'éditeur en ligne.
Cliquez sur Calques> Ajouter un calque> Recherchez le calque (couche pandas) dans les calques compatibles et sélectionnez la version.
Ajoutez également la couche AWSLambda-Python36-SciPy1x disponible par défaut pour importer numpy.
Sélection de la couche depuis la console
Merci à cet article moyen https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e =
Pour obtenir des bibliothèques supplémentaires dans Lambda, nous devons les compiler sur Amazon Linux (cela est important si la bibliothèque sous-jacente est basée sur C ou C++ comme pour Numpy) et les empaqueter dans un fichier Zip avec le script python de votre choix. courir à Lambda.
Pour obtenir la version compilée Amazon Linux des bibliothèques. Vous pouvez trouver une version déjà compilée, comme celle de @pbegle, ou la compiler vous-même. Pour le compiler nous-mêmes, il y a deux options: - compiler les bibliothèques sur une instance EC2 https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/ - Compiler les bibliothèques sur une version fixe de l’environnement Lambda https://serverlesscode.com/post/scikitlearn-with-Amazon-linux-container/
Après la dernière option avec Docker, il est possible de le faire fonctionner en suivant les instructions du message de blog ci-dessus et en ajoutant:
pip install --use-wheel pandas
dans le script pour compiler les bibliothèques:
https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21
Légèrement dupliqué de impossible de trouver MySQL dans NodeJS avec AWS Lambda
Vous devez conditionner vos bibliothèques avec Lambda. Comme lambda fonctionne sur un cloud public, vous ne pouvez pas le configurer.
Maintenant, dans votre cas, comme vous utilisez des pandas, vous devez empaqueter Pandas avec votre Zip. Obtenez un chemin vers les pandas (par exemple: /Users/dummyUser/anaconda/lib/python3.6/site-packages) et copiez la bibliothèque à l’endroit où vous avez votre code de fonction lambda. Dans votre code, reportez-vous à pandas de votre copie locale. Pendant le + bibliothèques), et uploadez comme vous voulez, ça devrait marcher.
J'ai eu du mal avec une erreur similaire en essayant d'utiliser le moteur python3.6. Lorsque je suis passé à la version 2.7, cela a bien fonctionné pour moi. J'ai utilisé Amazon AMI pour créer mon fichier Zip, mais celui-ci ne contient que python3.5, pas 3.6. J'imagine que l'inadéquation des versions en était la raison. Mais c'est juste une hypothèse, je n'ai pas encore essayé le processus sur une installation de python3.6.
AWS Lambda utilise Amazon Linux système d'exploitation. L'idée est de télécharger Pandas et NumPy compatible avec Amazon Linux . Ce que vous téléchargez avec pip
est spécifique à Windows ou Mac. Vous devez télécharger la version compatible pour Linux afin que votre fonction Lambda puisse la comprendre. Ces fichiers sont appelés fichiers wheel
.
Créer un nouveau répertoire local avec lambda_function.py
fichier. Installez Pandas dans un répertoire local avec pip:
$ pip install -t . pandas
Accédez à https://pypi.org/project/pandas/#files . Recherchez et téléchargez les plus récents *manylinux1_x86_64.whl
paquet. Dans mon cas, j'utilise Python 3.6 sur ma fonction Lambda, j'ai donc téléchargé ce qui suit:
Télécharger tous les fichiers dans le répertoire avec lambda_function.py
. Supprimer pandas
, numpy
et *.dist-info
répertoires. Décompressez les fichiers.
$ rm -r pandas numpy *.dist-info
$ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
$ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl
Supprimer les fichiers, *.dist-info
, et __pycache__
. Préparer Zip.zip
archive:
$ rm -r *.whl *.dist-info __pycache__
$ Zip -r Zip.zip .
Télécharger le Zip.zip
fichier dans votre fonction Lambda.
Source: https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e
avec framework sans serveur , vous pouvez facilement empaqueter et déployer vos dépendances correctement.
vous devez seulement;
installer sans serveur
npm install -g serverless
créez un fichier serverless.yml à la racine de votre projet avec les éléments suivants:
service: numpy-test
# define the environment of your lambda
provider:
name: aws
runtime: python3.6
# specify the function you want to deploy
functions:
numpy:
# path to your lambda_handler function
handler: path/to/function.lambda_handler
# add a plugin that allows serverless to package python libraries
# specified in the requirements.txt or Pipfile
plugins:
- serverless-python-requirements
# this section makes sure your libraries get build correctly
# for an aws lambda environment
custom:
pythonRequirements:
dockerizePip: non-linux
ajustez le chemin/to/function.lambda_handler
assurez-vous que docker est en cours d'exécution et exécutez
serverless deploy
une fois le déploiement terminé, accédez à la console AWS, recherchez la fonction numpy-test-dev-numpy et testez votre fonction.
cet article explique en détail les étapes nécessaires.
Votre code donne toujours cette erreur
car lambda ne contient aucune bibliothèque externe, il possède une bibliothèque fournie par défaut avec Python.
si vous utilisez une bibliothèque externe comme pandas, numpy ou tout autre. vous devez installer cette bibliothèque sur Aws Lambda
avant de l'utiliser
voir votre code
import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
return "Welcome to Pandas usage in AWS Lambda"
ici aucune installation de la bibliothèque pandas, votre code ne fonctionne donc pas).
Je suggère d'utiliser votre code comme suit. écrivez tout votre code à l'intérieur de la fonction lambda
import json
def lambda_handler(event, context):
#install python libray here
print('Loading function')
import pandas as pd
return "Welcome to Pandas usage in AWS Lambda"
Le code final se présente comme suit
def lambda_handler(event, context):
import pip
def install(package):
if hasattr(pip, 'main'):
pip.main(['install', package])
else:
pip._internal.main(['install', package])
if __== '__main__':
install('pandas')
#install python libray here
print('Loading function')
import pandas as pd
return "Welcome to Pandas usage in AWS Lambda"
Ceci est similaire à la réponse de Randeep mais vous n'avez pas besoin d'utiliser les couches Lambda si vous ne voulez pas le faire.
Comme d'autres l'ont déjà indiqué, cela ne fonctionne pas car pandas/numpy nécessite la construction de binaires et le système d'exploitation de votre machine de génération (Linux, Mac, Windows) ne correspond pas au système d'exploitation de Lambda (Amazon Linux).
Pour résoudre ce problème, vous pouvez utiliser docker pour télécharger/construire vos dépendances et les empaqueter sur Amazon Linux. Amazon fournit une image Docker à cet effet. Voir ci-dessous comment j'ai construit mon package python pour Python 3.6 runtime (ils ont d'autres dockers pour tous les autres runtimes))):
Mettez toutes vos dépendances dans un requirements.txt
fichier, par exemple:
openpyxl
boto3
pandas
Créez un script (nommé build.sh
) qui construira votre paquet, voici à quoi ressemblait le mien:
#!/bin/bash
# remove old build artifacts
rm -rf build
rm lambda_package.Zip
# make build dir and copy my lambda handler file into it
mkdir build
cp lambda_daily_util_gen.py build/
# Use requirements file to download/build dependencies into the build folder
cd build
pip install -r ../requirements.txt --target .
# Create an lambda package with my files and all dependencies
Zip -r9 ../lambda_package.Zip .
Assurez-vous que l'image de génération Amazon Linux lambda est extraite:
$ docker pull lambci/lambda
Exécutez votre script de construction à l'intérieur du conteneur docker:
Mac/Linux:
$ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh
Les fenêtres:
docker run --rm -v ${PWD}:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh
Vous devriez maintenant voir un fichier nommé lambda_package.Zip
qui a été construit sur Amazon Linux, vous pouvez le télécharger sur AWS.
J'espère que ça t'as aidé.