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