web-dev-qa-db-fra.com

Fonction AWS Lambda Python3.7 - numpy: impossible d'importer le nom 'WinDLL'

J'ai une fonction configurée dans lambda qui exécute un script python à partir d'un fichier . Zip. J'ai créé un virtualenv et inclus tous les packages nécessaires dans le fichier . Zip (à partir du Lib\site-packages dossier).

Voici les instructions d'importation pour les packages utilisés dans le script:

import requests
import boto3
import logging
import os
from botocore.exceptions import ClientError
from pprint import pprint
import pandas as pd
from datetime import datetime
import s3fs

Lorsque j'essaie d'exécuter la fonction lambda je reçois l'erreur suivante:

START RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'export-dev': Unable to import required dependencies:
numpy: cannot import name 'WinDLL' from 'ctypes' (/var/lang/lib/python3.7/ctypes/__init__.py)
END RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0
REPORT RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0  Duration: 1.65 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 70 MB  

Je n'utilise pas le ctypes, WinDLL ou tout autre package connexe explicitement dans mon code.

8
Pablo

Aws lambda vous enverra une erreur si vous n'avez pas la bonne version des dépendances empaquetées avec votre code, qui peut dépendre du système d'exploitation (lambda fonctionne sur linux) et de la version python.

En fonction de vos besoins, c'est pandas vous lançant l'erreur. Pour exécuter pandas sur lambda, vous devez inclure les packages suivants:

pandas - code compilé pour linux, c'est ce que lambda vous dirige. Vous pouvez le trouver ici https://pypi.org/project/pandas/#files téléchargez la version 'manylinux' du fichier .whl, qui correspond à votre python = version lambda.

  • par exemple. si vous utilisez py3.7, alors obtenez pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whl

  • Décompressez le contenu du fichier .whl dans le dossier racine de votre dossier lambda. Ceci est la version de la bibliothèque dont lambda a besoin

  • Remarque pour pandas 0,25+, vous devez également inclure le package pytz également, voir la note ci-dessous sur les demandes

numpy - Vous pouvez maintenant entrer dans lambda (testé pour py3.7) en installant une 'couche' via la console lambda, voir les captures d'écran ci-dessous.

Note annexe sur les demandes

  • Notez que le paquet ici https://pypi.org/project/requests/#files n'a qu'une version 'none-any', cela signifie que la source n'a pas besoin d'être compilée, donc vous peut inclure en toute sécurité la version que vous avez obtenue de pip

  • cela s'applique à la dépendance pytz de pandas ainsi

Captures d'écran installant des couches dans la console aws

adding a layer im lambdaselect layer

2
Spcogg the second

Puisque numpy est écrit en C, vous devez le construire pour une distribution linux. Je vous recommande d'utiliser le framework sans serveur car cela vous simplifiera beaucoup la vie lorsque vous utilisez un ordinateur portable Windows.

Installez le framework sans serveur et assurez-vous d'avoir docker

allez à la racine de votre projet et exécutez:

sls create --template aws-python

installez le plugin pour déployer les applications python:

serverless plugin install -n serverless-python-requirements

dans votre serverless.yml ajout de fichier:

plugins:
   - serverless-python-requirements

custom:
  pythonRequirements:
     dockerizePip: non-linux

assurez-vous d'ajuster le chemin vers votre fonction lambda

functions:
  hello:
    handler: handler.hello

déployer avec les bibliothèques correctes en utilisant

sls deploy 
2
Vincent Claes