[PYTHON] [AWS Lambda] Erstellen Sie ein Bereitstellungspaket mit dem Amazon Linux Docker-Image

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.

Fehlerbeispiel

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'

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.

Gegenmaßnahmen

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.

success

Automatisierung

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"

Stichprobe

Das diesmal verwendete Beispiel der Lambda-Funktion wird in dieses Repository gestellt. https://github.com/morishin/python-lambda-function-test

Impressionen

AWS Lambda Es ist praktisch, aber wenn Sie versuchen, etwas Aufwändiges zu tun, weinen Sie fast.

Recommended Posts

[AWS Lambda] Erstellen Sie ein Bereitstellungspaket mit dem Amazon Linux Docker-Image
Erstellen Sie ein Docker-Container-Image mit JRE8 / JDK8 unter Amazon Linux
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Vermeiden Sie die Fallstricke bei der Verwendung eines Mac (für Linux-Benutzer?)
Erstellen Sie eine GCE-Instanz aus einem GCR Docker-Image mithilfe von Terraform
Generieren Sie ein Docker-Image mit Fabric
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Verwenden von PhantomJS mit AWS Lambda bis zur Anzeige des HTML-Codes der Website
Da das Dokcer-Image (1 GB) von OpenJDK11 groß ist, erstellen Sie ein kleines Image (85 MB) mit Alpine Linux + Jlink.
Erstellen Sie mit dem Sympy-Modul ein Diagramm
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Fügen Sie Python3 in den Docker-Container von Amazon Linux2 ein
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Erstellen Sie eine GUI auf dem Terminal mit Flüchen
Scraping der Gewinndaten von Zahlen mit Docker
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Erstellen Sie Amazon Linux mit AWS EC2 und melden Sie sich an
Erstellen Sie unter Linux einen QR-Code für die URL
Erstellen Sie eine Webseite, auf der ein Modell ausgeführt wird, das die Auflösung des Bilds mithilfe von Gradio erhöht, wodurch das Erstellen eines Webbildschirms vereinfacht wird
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[Python] Maskiere das Bild mit Pillow zu einem Kreis
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Ankündigung der Verfügbarkeit von Java 11 LTS unter Amazon Linux 2
Durchsuchen Sie die Tabelle mit sqlalchemy und erstellen Sie ein Wörterbuch
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Beispiel für die Verwendung von Lambda
Ändern Sie das Gebietsschema von Amazon Linux mithilfe der Lineinfile von Ansible in Japan
Erstellen Sie sofort ein Diagramm mit 2D-Daten mit der matplotlib von Python
Erstellen Sie eine VS Code + Docker-Entwicklungsumgebung mit Linux VM
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls
Erstellen Sie mithilfe der Twitter-Streaming-API einen Echtzeit-Bot für die automatische Antwort
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Eine grobe Zusammenfassung der Unterschiede zwischen Windows und Linux
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
Erstellen Sie ein Korrelationsdiagramm aus dem Konversationsverlauf von Twitter
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
[Linux] Schreiben Sie ein Bereitstellungstool mit rsync und einem Shell-Skript
Verwenden Sie wxpython, um ein Gadget-ähnliches transparentes Hintergrundbildfenster zu erstellen
Senden Sie eine Anfrage von AWS Lambda an Amazon Elasticsearch Service
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Rufen Sie den Hostnamen des Host-PCs mit Docker unter Linux ab
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Laden Sie eine externe Bibliothek aus einer Lambda-Funktion mit AWS Lambda Layers. Die Python-Umgebung für Amazon Linux 2 ist ebenfalls vorhanden. (Python3.6, Anaconda)