Ich würde gerne sehen, wie ein externes Modul für AWS Lambda (Lambda) bereitgestellt wird. Nehmen wir als Beispiel Python.
Ausführungsreihenfolge
Es spielt keine Rolle, für welche Sie sich entscheiden * 2.
Dieser Schritt ist nicht erforderlich für Module, die in Pure Python geschrieben wurden, ohne intern die Sprache C zu verwenden, z. B. das Anforderungsmodul. *** Für Module, die von der C-Sprache abhängen, wie z. B. numpy und scipy, ist es jedoch einfacher, in derselben Umgebung wie die Lambda-Ausführungsumgebung zu entwickeln. Selbst wenn Sie numpy, das unter Windows oder Mac installiert ist, komprimieren und bereitstellen, tritt ein Fehler auf. *** ***
Hier verwenden wir das öffentlich verfügbare Docker-Image *** lambci / lambda: build-python3.7 *** als Umgebung für Amazon Linux 2.
Erstellen Sie ein geeignetes Verzeichnis und erstellen Sie den Quellcode (lambda_function.py) und die Docker-Datei, die von Lambda ausgeführt werden sollen.
Inhalt von Dockerfile
FROM lambci/lambda:build-python3.7
CMD ["pip3","install","numpy","-t","/var/task"]
Der Inhalt von lambda_function.py ist angemessen
import numpy as np
def lambda_handler(event,context):
print(np.arange(10).reshape(2,5))
Quell- und Dockerfile-Erstellung abgeschlossen
~$ ls
Dockerfile lambda_function.py
Danach erstellen und ausführen.
~$ docker image build -t numpy:latest .
~$ docker container run --rm -v ${PWD}:/var/task numpy:latest
*** -v $ {PWD}: / var / task, um auf das externe Modul zu verweisen, das auch im Host-Betriebssystem im Container installiert ist. *** ***
Übrigens ist / var / task einer der Pfade, auf die sich Lambda bezieht, um externe Module zu importieren. Wenn Sie in einem Docker-Container ausgeführt werden, müssen Sie das externe Modul in diesen Pfad einfügen. Überprüfen Sie als Test den Pfad mit Lambda wie folgt.
import sys
def lambda_handler(event,context):
print(sys.path)
"""
python3.Ausführungsergebnis in 7
['/var/task', '/opt/python/lib/python3.7/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python37.zip', '/var/lang/lib/python3.7', '/var/lang/lib/python3.7/lib-dynload', '/var/lang/lib/python3.7/site-packages', '/opt/python/lib/python3.7/site-packages', '/opt/python']
"""
Wenn der obige Befehl erfolgreich ist, sollten sich die Quelle und das externe Modul (numpy) in derselben Hierarchie befinden. Jetzt müssen Sie es nur noch mit dem Lambda-Layer oder der Quelldatei komprimieren und bereitstellen. Wählen Sie also eine der folgenden 2.
~$ ls
Dockerfile bin lambda_function.py numpy numpy-1.18.3.dist-info numpy.libs
Erstellen Sie wie oben erwähnt ein Python-Verzeichnis und verschieben Sie numpy-bezogene Dateien und Verzeichnisse in dieses Verzeichnis, damit Lambda externe Module laden kann. Wenn Sie das Python-Verzeichnis zu Beginn des Ausführungsvorgangs erstellt haben, müssen Sie Folgendes nicht tun.
~$ mkdir python
~$ mv bin numpy numpy-1.18.3.dist-info numpy.libs python
Zippen Sie das externe Modul und stellen Sie es auf der Lambda-Ebene bereit.
~$ zip -rq numpy.zip python
Komprimieren Sie die Quelldateien und stellen Sie sie mit der Lambda-Konsole oder der AWS-CLI bereit.
~$ zip -q lambda_function.zip lambda_function.py
Komprimieren Sie es und stellen Sie es mit der Lambda-Konsole oder der AWS-CLI bereit. Wenn Sie Lambda Layer verwenden, trennen Sie das externe Modul und die Quelldatei, aber dieses Mal werde ich sie alle zusammen komprimieren. Das Zip-Ziel ist also *.
~$ zip -rq numpy.zip *
Bei der Bereitstellung in Lambda ist es möglicherweise zu groß, um auf dem Bildschirm angezeigt zu werden (numpy ist fast unsichtbar), kann jedoch ausgeführt werden.