[PYTHON] Stellen Sie externe Module (numpy, scipy, Anfragen usw.) für AWS Lambda bereit

Ich würde gerne sehen, wie ein externes Modul für AWS Lambda (Lambda) bereitgestellt wird. Nehmen wir als Beispiel Python.

Ausführungsreihenfolge

  1. Bereiten Sie Amazon Linux 2 (Lambda-Ausführungsumgebung) vor. Anstatt EC2 zu verwenden, erstellen wir hier ein Bereitstellungspaket lokal mit Docker Image für Lambda.
  2. Stellen Sie Lambda mit der Quelldatei bereit
  3. Verwendung von Lambda Layer

Es spielt keine Rolle, für welche Sie sich entscheiden * 2.

1. Bereiten Sie Amazon Linux 2 vor (Lambda-Ausführungsumgebung)

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

2. Verwendung von Lambda Layer

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

2. Stellen Sie Lambda mit der Quelldatei bereit

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.

Recommended Posts

Stellen Sie externe Module (numpy, scipy, Anfragen usw.) für AWS Lambda bereit
[AWS / Lambda] Laden einer externen Python-Bibliothek
Poste regelmäßig mit AWS Lambda auf Twitter!
Zusammenfassung des Schreibens von AWS Lambda