web-dev-qa-db-fra.com

Pandas dans AWS lambda donne une erreur numpy

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"
  1. J'ai compressé ce fichier python avec numpy, pandas et pytz en tant que package de déploiement (toutes ces opérations ont été effectuées sur une machine Linux Amazon EC2)).
  2. Puis téléchargé le package dans S3
  3. Création d'une fonction lambda (runtime = python3.6) et téléchargement du package de déploiement à partir de S3

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

38
Kingz

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.

8
pbegle

Pour inclure numpy dans votre lambda Zip, suivez les instructions de cette page dans la documentation AWS ...

Comment puis-je ajouter Python avec des fichiers binaires compilés à mon package de déploiement et le rendre compatible avec AWS Lambda?

Pour paraphraser les instructions en utilisant numpy comme exemple:

  1. Ouvrez les pages de module sur pypi.org. https://pypi.org/project/numpy/
  2. Choisissez Télécharger les fichiers.

  3. 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

  1. Décompressez le fichier wheel dans le dossier/path/to/project-dir. Pour ce faire, vous pouvez utiliser la commande unzip sur la ligne de commande. Il y a évidemment d'autres moyens.

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.

What it might look like

6
chim

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.

  1. Créez un fichier Requirements.txt avec les éléments suivants:
pandas==0.23.4
pytz==2018.7
  1. Créez un fichier get_layer_packages.sh avec les éléments suivants:
#!/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}
  1. Exécutez les commandes suivantes dans le même répertoire:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

Zip -r pandas.Zip .
  1. Chargez le calque dans un compartiment S3.

  2. 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
  1. Accédez à la console Lambda et téléchargez votre code sous forme de fichier Zip ou utilisez l'éditeur en ligne.

  2. Cliquez sur Calques> Ajouter un calque> Recherchez le calque (couche pandas) dans les calques compatibles et sélectionnez la version.

  3. Ajoutez également la couche AWSLambda-Python36-SciPy1x disponible par défaut pour importer numpy.

Sélection de la couche depuis la console

  1. Testez le code. Cela devrait fonctionner maintenant !!!!

Merci à cet article moyen https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e =

5
Ranadeep Guha

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

2
Pierre-Antoine

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.

1
Dishant Kapadiya

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.

0
Pavel Anni

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.

enter image description here

Source: https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e

0
korniichuk

avec framework sans serveur , vous pouvez facilement empaqueter et déployer vos dépendances correctement.

vous devez seulement;

  1. installer sans serveur

    npm install -g serverless
    
  2. 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

  3. 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.

0
Vincent Claes

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" 
0
user6502956

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é.

0
JD D