Hinweis: Dieser Artikel ist ein Nachdruck des Hinweisartikels. Wenn der Inhalt aktualisiert wird, wird der Hinweis aktualisiert. Wenn der Qiita-Artikel veraltet ist, überprüfen Sie bitte auch den Hinweis.
https://note.com/thiroyoshi/n/nfcb0be8c0a22
Hallo. Das ist Thiroyoshi.
Dieses Mal möchte ich eine kleine Technik einführen, wenn ich die Python-Bibliothek mit Lambda verwende. Ich habe dies in die VueSlsApp aufgenommen. Es sieht nicht anders aus, wird aber empfohlen, weil es die Quelle vereinfacht.
Wenn Sie VueSlsApp noch nicht kennen, lesen Sie die folgenden Einführungsartikel und Magazine. https://note.com/thiroyoshi/n/na16112b4ec1b
Sie können tatsächlich berühren, was Sie bereitgestellt haben, und zwar aus dem Folgenden. https://vueslsapp.thiroyoshi.com/
Das VusSlsApp-Repository befindet sich unten. https://github.com/thiroyoshi/vueslsapp
Inhaltsverzeichnis
--Wenn Sie die Python-Bibliothek mit Lambda verwenden, tritt das Problem auf, die Bibliothek zusammen zu heben ... Ein schwerwiegenderes Problem, das den Pfad nicht überschreitet
Das Problem, mit dem jeder bei der Verwendung von Python mit Lambda konfrontiert ist, besteht darin, eine Bibliothek zusammenzustellen. Jetzt gibt es verschiedene Tools, die relativ einfach zu erstellen sind.
Das Serverless Framework, das auch in VueSlsApp verwendet wird, sammelt automatisch die Elemente im Verzeichnis, sodass es kein Problem gibt.
Das Problem ist, dass ** die Bibliothek nicht gefunden und nicht ausgeführt werden kann, da der Pfad zum Zeitpunkt der Ausführung nicht übergeben wird **. Es spielt keine Rolle, ob Sie das Serverless Framework verwenden ...
Natürlich hat Lambda, das die Python-Ausführungsumgebung enthält, nicht den Pfad der Bibliothek, die ich ohne Einstellungen hinzugefügt habe.
Dann ** pass einfach den Pass **.
In Python gibt es eine Umgebungsvariable namens PYTHONPATH, die den Pfad für die Suche in der Quelle festlegt. Siehe unten für den offiziellen Kommentar.
https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHONPATH
Der folgende Artikel beschreibt, wie PYTHONPATH in Lambda und alle Forschungsinhalte bis zu diesem Punkt übergeben werden. informativ.
http://uorat.hatenablog.com/entry/2017/08/31/145340
Die wichtigen Punkte sind wie folgt.
・/var/Geben Sie auch die Laufzeit an
Auf Lambda scheint die Python-Laufzeit standardmäßig auch in PYTHONPATH angegeben zu sein. Mit anderen Worten: ** Wenn Sie PYTHONPATH selbst überschreiben, können Sie Python überhaupt nicht ausführen **.
In VueSlsApp werden Bibliotheken in einem Verzeichnis namens pylibs gesammelt, das wie folgt festgelegt ist.
** ・ serverless.yml (Teilauszug) **
PYTHONPATH: /var/runtime:/var/task/pylibs
Infolgedessen wird die externe Bibliotheksreferenz wie folgt geändert:
** ・ functions / repository / messages_repository.py (vor der Änderung) **
import json
import random
import hashlib
from decimal import Decimal
from functions.common import initializer
initializer.add_path()
from pylibs import boto3
from pylibs.boto3.dynamodb.conditions import Key
from functions.common.decimal_encoder import DecimalEncoder
** ・ functions / repository / messages_repository.py (nach Änderung) **
import json
import random
import hashlib
from decimal import Decimal
from pylibs import boto3
from pylibs.boto3.dynamodb.conditions import Key
from functions.common.decimal_encoder import DecimalEncoder
Das Update ist, dass der Code, der den Pfad der externen Bibliothek ** initializer.add_path () ** dynamisch hinzugefügt hat, nicht mehr benötigt wird.
Es ist nicht cool und die Leistung sinkt, also habe ich mich gefragt, wie ich diese Methode stoppen kann ... Ich war froh endlich aufzuhören! (Jubel
Die obige Methode ist nicht geeignet, wenn die Bibliothek selbst für die Ausführungsumgebung neu erstellt werden muss.
Diese Methode ist nur für ** die Verwendung einer Bibliothek vorgesehen, die auf dem Betriebssystem mit pip install ** ausgeführt wird. Wenn Sie die Installation unter Windows durchführen, werden die unter Windows ausgeführten Bibliotheken zusammen aufgelistet.
Mit anderen Worten, diese Methode ist nicht geeignet, wenn die Umgebung stark abhängig ist und Sie die Build-Umgebung der Bibliothek entsprechend der Ausführung unter Lambda ändern müssen (= unter Amazon Linux).
In einem solchen Fall gibt es meiner Meinung nach die folgenden Methoden. (Ich habe es nicht versucht)
Sie können die Umgebung bei der Pip-Installation ändern. Mit anderen Worten, lassen Sie uns das Betriebssystem, auf dem die CI / CD-Umgebung ausgeführt wird, auf Amazon Linux einstellen.
Abhängig von den CI / CD-Tools und -Diensten können Sie das Betriebssystem möglicherweise nicht frei ändern. Ich denke, Sie müssen sorgfältig prüfen, ob Sie das Amazon Linux-Image in Ihrer eigenen Umgebung verwenden können.
Es gibt ein Serverless Framework-Plug-In, das Python-Bibliotheken gut organisiert.
https://www.npmjs.com/package/serverless-python-requirements
Dieses Plug-In verwendet Docker auch zum Erstellen in derselben Umgebung wie die Ausführungsumgebung.
Warum also nicht dieses Plug-In von Anfang an verwenden?
Der Grund ist einfach: ** PYTHONPATH ist alles, was Sie angeben müssen **.
Mit dem AP, den ich mache, macht Lambda nur einfache Dinge. Mit anderen Worten, es gibt fast keine Möglichkeit, eine umfangreiche Bibliothek zu verwenden, die von der Build-Umgebung abhängt. Darüber hinaus hat die Verwendung eines Plug-Ins in meiner Entwicklung viele unnötige Prozesse, z. B. die Installation und das Ausführen eines Docker-Containers, was die Ausführungszeit der Pipeline verlängern kann.
Dieses Mal habe ich einige Möglichkeiten vorgestellt, um den Python-Pfad in Lambda zu übergeben.
Schließlich gibt es verschiedene Methoden, aber es ist am besten, die Methode mit der höchsten Kostenleistung für Sie zu wählen. Selbst wenn es ein nützliches Werkzeug gibt, ist es nicht gut, es blind zu glauben und es zu benutzen.
Was brauchst du? Was brauchst du? Ist es nicht ein Faktor, der die Effizienz der Entwicklung verringert? Aus dieser Perspektive möchte ich Tools und Entwicklungsmethoden identifizieren.
Recommended Posts