Ich habe gehört, dass AWS Lambda Python 3.6 unterstützt, daher habe ich beschlossen, die Lambda-Funktion zu schreiben, die ich in Node.js in Python geschrieben habe, aber Lambda, das in C geschriebene Module wie numpy enthält. Wenn ich eine Funktion von einem Mac aus bereitstelle, ist es schwierig, sie auf Lambda auszuführen, da ** "Es ist ein Modul, das für den Mac entwickelt wurde und daher nicht geladen werden kann" **.
Ich habe dieses Problem mit Docker gelöst und werde zusammenfassen, wie es geht.
[Aktualisiert am 25. März 2020] Ich habe auch darüber geschrieben, wie man eine Lambda-Schicht erstellt. Erstellen Sie eine Ebene für AWS Lambda Python mit Docker-Qiita
Ziehen Sie dieses Mal in Betracht, eine Lambda-Funktion bereitzustellen, die nichts anderes tut, als numpy wie folgt zu laden:
Verzeichnisaufbau
.
├── main.py
└── requirements.txt
main.py
import numpy
def handler(event, context):
pass
requirements.txt
numpy
Der folgende Befehl installiert numpy im selben Verzeichnis, funktioniert jedoch unter Lambda nicht, da numpy ein Mac-Build ist, selbst wenn ich es komprimiere und bereitstelle.
$ pip install -r requirements.txt -t .
Sie sollten wahrscheinlich diesen Fehler erhalten.
Unable to import module 'main':
Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all files not under version control). Otherwise reinstall numpy.
Original error was: cannot import name 'multiarray'
Wenn ich die Lösung google, erhalte ich nur eine mysteriöse Antwort wie "Starten Sie eine Amazon Linux-Instanz und erstellen Sie sie dort". ** Ich möchte mit AWS Lambda ohne Server, benötige jedoch einen Server für die Bereitstellung. ** Wie ist das? ?? ??
Kurz gesagt, ich wünschte, ich könnte in einer Linux-Umgebung bauen. Sie können dies mit Docker tun.
Gehen Sie wie folgt vor, um den obigen Befehl für den Docker-Container auszuführen.
$ docker run --rm -v $(pwd):/work -w /work python:3.6 pip install -r requirements.txt -t .
Starten Sie den Container über das Python 3.6-Image [^ linux], hängen Sie das aktuelle Verzeichnis in das Arbeitsverzeichnis / work
ein und installieren Sie das Paket dort. Wenn der Build abgeschlossen ist, wird dieser Container nicht mehr benötigt, daher habe ich die Option "--rm" hinzugefügt, um ihn zu entfernen.
[^ linux]: python: 3.6
Das Image basiert auf Debian, unterscheidet sich also von der Lambda-Ausführungsumgebung (Amazon Linux), wurde jedoch installiert numpy-1.13.1-cp36-cp36m-manylinux1_x86_64.whl
Ich denke, Linux ist in Ordnung. Möglicherweise gibt es andere fehlerhafte Module als numpy, aber in diesem Fall können Sie das Amazon Linux Docker-Image löschen.
Nachdem Sie eine Nummer in einer Linux-Umgebung erstellt haben, sollten Sie diese festigen und bereitstellen können.
Sie fragen sich vielleicht: "Sobald Sie das Modul für Linux installiert haben, können Sie es während der Entwicklung nicht mehr auf Ihrem Mac ausführen."
Sicher, es kann nicht auf einem Mac ausgeführt werden, aber ich denke, es ist am besten, alles bei der Entwicklung in einem Docker-Container auszuführen.
$ docker run --rm -v $(pwd):/work -w /work python:3.6 python -c 'import main; main.handler({}, None)'
So was.
Recommended Posts