Si vous souhaitez utiliser une bibliothèque qui ne se trouve pas dans l'environnement d'exécution AWS Lambda, vous devez télécharger le groupe source de bibliothèque dans l'environnement local, l'inclure dans le package de déploiement et le télécharger sur Lambda.
Dans le cas de Python, par exemple, les étapes suivantes sont effectuées lors de la création d'un package de déploiement.
$ virtualenv -p python2.7 venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ zip deploy_package.zip lambda_function.py #Rendre le script d'exécution zip
$ cd venv/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * #Ajouter la bibliothèque installée par pip à zip
Si la bibliothèque que vous souhaitez utiliser est du code Python pur, ce package fonctionnera sur Lambda sans aucun problème, mais si la bibliothèque dépend des fonctions du système d'exploitation, Lambda sera construite et installée dans l'environnement local. Cela ne fonctionne pas même si je le télécharge ci-dessus.
Dans l'exemple ci-dessus, pip install
doit être effectué dans le même environnement que l'environnement d'exécution de Lambda.
Créez et exécutez une fonction Lambda qui utilise une bibliothèque appelée pycrypto
.
requirements.txt
pycrypto==2.6.1
lambda_function.py
from Crypto.PublicKey import RSA
def lambda_handler(event, context):
return {"messagge": "success"}
Préparez les fichiers ci-dessus et créez un package de déploiement dans votre environnement OS X local.
$ virtualenv -p python2.7 venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ zip deploy_package.zip lambda_function.py
$ cd venv/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip *
Lorsque je télécharge le fichier deploy_package.zip
créé sur AWS Lambda et que je l'exécute, j'obtiens l'erreur suivante:
Unable to import module 'lambda_function'
En regardant le texte complet du journal des erreurs, il dit «Impossible d'importer le module'lambda_function»: /var/task/Crypto/Util/_counter.so: en-tête ELF invalide ». Il semble que les informations d'en-tête du fichier référencé par pycrypto
ne soient pas valides. La cause est que l'environnement dans lequel pycrypto
est installé est différent de l'environnement d'exécution Lambda.
Vous pouvez contourner ce problème en installant la bibliothèque à l'aide de l'image Amazon Linux Docker.
Préparez un tel Dockerfile dans la même hiérarchie que le fichier ci-dessus
Dockerfile
FROM amazonlinux:latest
RUN yum -y update && yum -y install gcc python27-devel
RUN cd /tmp && \
curl https://bootstrap.pypa.io/get-pip.py | python2.7 - && \
pip install virtualenv
WORKDIR /app
CMD virtualenv -p python2.7 venv-for-deployment && \
source venv-for-deployment/bin/activate && \
pip install -r requirements.txt
L'exécution de cette commande crée un code de bibliothèque Python construit sur Amazon Linux avec le nom venv-for-deployment
.
$ docker build . -t packager
$ docker run --rm -it -v $(PWD):/app packager
Créez ensuite un zip du package de déploiement et téléchargez-le sur AWS Lambda comme indiqué ci-dessous.
$ zip deploy_package.zip lambda_function.py
$ cd venv-for-deployment/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * .* #Si dotfile est inclus".*"Aussi
Lorsqu'elle est exécutée, la bibliothèque peut être importée et «" succès "» s'affiche en toute sécurité.
Puisqu'il y a beaucoup de commandes à frapper un peu, il est pratique de créer un Makefile comme celui-ci car un zip sera généré juste par make
.
Makefile
package:
docker build . -t packager
docker run --rm -it -v $(PWD):/app packager
zip deploy_package.zip lambda_function.py
cd venv-for-deployment/lib/python2.7/site-packages && zip -r ../../../../deploy_package.zip * .*
echo "Completed. Please upload deploy_package.zip to AWS Lambda"
L'échantillon de fonction Lambda utilisé cette fois est placé dans ce référentiel. https://github.com/morishin/python-lambda-function-test
AWS Lambda C'est pratique, mais lorsque vous essayez de faire quelque chose d'un peu élaboré, vous pleurez presque.
Recommended Posts