Wenn Sie eine Bibliothek verwenden möchten, die sich nicht in der AWS Lambda-Ausführungsumgebung befindet, müssen Sie die Bibliotheksquellgruppe in der lokalen Umgebung herunterladen, in das Bereitstellungspaket aufnehmen und auf Lambda hochladen.
Im Fall von Python werden beispielsweise beim Erstellen eines Bereitstellungspakets die folgenden Schritte ausgeführt.
$ virtualenv -p python2.7 venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ zip deploy_package.zip lambda_function.py #Machen Sie das Ausführungsskript zip
$ cd venv/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * #Fügen Sie die von pip installierte Bibliothek zu zip hinzu
Wenn die Bibliothek, die Sie verwenden möchten, reiner Python-Code ist, funktioniert dieses Paket problemlos unter Lambda. Wenn die Bibliothek jedoch von den Funktionen des Betriebssystems abhängt, wird Lambda in der lokalen Umgebung erstellt und installiert. Es funktioniert nicht, auch wenn ich es oben hochlade. Im obigen Beispiel sollte "pip install" in derselben Umgebung wie die Ausführungsumgebung von Lambda durchgeführt werden.
Erstellen Sie eine Lambda-Funktion und führen Sie sie aus, die eine Bibliothek namens "pycrypto" verwendet.
requirements.txt
pycrypto==2.6.1
lambda_function.py
from Crypto.PublicKey import RSA
def lambda_handler(event, context):
return {"messagge": "success"}
Bereiten Sie die obigen Dateien vor und erstellen Sie ein Bereitstellungspaket in Ihrer lokalen OS X-Umgebung.
$ 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 *
Wenn ich die erstellte Datei "deploy_package.zip" auf AWS Lambda hochlade und ausführe, wird folgende Fehlermeldung angezeigt:
Unable to import module 'lambda_function'
Im vollständigen Text des Fehlerprotokolls heißt es: "Modul" Lambda_Funktion kann nicht importiert werden ": /var/task/Crypto/Util/_counter.so: Ungültiger ELF-Header". Es scheint, dass die Header-Informationen der Datei, auf die von "pycrypto" verwiesen wird, ungültig sind. Die Ursache ist, dass sich die Umgebung, in der "pycrypto" installiert ist, von der Lambda-Ausführungsumgebung unterscheidet.
Sie können dieses Problem umgehen, indem Sie die Bibliothek mit dem Amazon Linux Docker-Image installieren.
Bereiten Sie eine solche Docker-Datei in derselben Hierarchie wie die obige Datei vor
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
Durch Ausführen dieses Befehls wird ein auf Amazon Linux erstellter Python-Bibliothekscode mit dem Namen "venv-for-deploy" erstellt.
$ docker build . -t packager
$ docker run --rm -it -v $(PWD):/app packager
Erstellen Sie dann eine Zip-Datei des Bereitstellungspakets und laden Sie sie wie unten gezeigt auf AWS Lambda hoch.
$ zip deploy_package.zip lambda_function.py
$ cd venv-for-deployment/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * .* #Wenn Dotfile enthalten ist".*"Ebenfalls
Bei der Ausführung kann die Bibliothek importiert werden und "Erfolg" wird sicher angezeigt.
Da es viele Befehle gibt, die ein wenig getroffen werden müssen, ist es praktisch, ein Makefile wie dieses zu erstellen, da eine Zip-Datei nur durch "make" generiert wird.
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"
Das diesmal verwendete Beispiel der Lambda-Funktion wird in dieses Repository gestellt. https://github.com/morishin/python-lambda-function-test
AWS Lambda Es ist praktisch, aber wenn Sie versuchen, etwas Aufwändiges zu tun, weinen Sie fast.
Recommended Posts