Dieser Faktor ist ein Abhängigkeitsverwaltungsfaktor, der sowohl ursprünglich als auch darüber hinaus ist. In modernen Entwicklungssprachen werden die meisten Paketverwaltungstools bereitgestellt, um Bibliotheksreferenzen wie npm, pip und gradle zu lösen. Durch das Auflösen von Anwendungsabhängigkeiten mithilfe einer solchen Paketverwaltung wird sichergestellt, dass ein gut konfigurierter Satz von Anwendungen in jeder Umgebung erstellt und ausgeführt werden kann. In Bezug auf Abhängigkeiten müssen Sie nicht nur auf Anwendungsbibliotheken achten, sondern auch Skripte und Bereitstellungsskripte erstellen. Es muss verhindert werden, dass diese Skripte implizit für Bibliotheken und Befehle verwendet werden, die auf einem bestimmten System installiert sind.
Wenn ich eine App in einer Windows-Umgebung wie mir erstelle und das Skript in einer Shell geschrieben bin, habe ich das Gefühl, dass es systemabhängig ist. Solange Sie eine Laufzeitversion auf einem beliebigen Betriebssystem haben. Ich denke, wir sollten uns bemühen, die gesamte Entwicklung, das Testen und die Ausführung der Anwendung unter gleichen Bedingungen abzudecken. ..
Auch dieses Mal werde ich diesen Faktor basierend auf Lambda und Python weiter üben. Ich werde mit dem Ablauf von der Paketverwaltung mit Pythons Pipenv fortfahren und ein Paket für die Bereitstellung der darauf basierenden Lambda-Funktionen erstellen. Zu verwendendes Python ist 3.8, und die Laufzeitinstallation beginnt an dem Punkt, an dem sie abgeschlossen ist.
pipenv pipenv ist ein Tool, das die Paketverwaltung mit pip und die Verwaltung virtueller Umgebungen mit venv integriert. Ich denke, es ist auf hohem Niveau als Werkzeug zum expliziten Trennen und Verwalten von Abhängigkeiten.
pip install pipenv
PIPENV_VENV_IN_PROJECT=1
Dadurch wird sichergestellt, dass die von virtualenvv erstellte virtuelle Umgebung projektspezifisch ist. In Anbetracht der Tatsache, dass mehrere Projekte gleichzeitig bearbeitet werden, wird empfohlen, sie so weit wie möglich vom Standpunkt der Abhängigkeitstrennung zu trennen.
pipenv --python 3.8
Die Pipfile
Datei und der .venv
Ordner werden direkt unter dem Projektordner erstellt und Sie können loslegen.
Mit pipenv ist es möglich, es nur in der Entwicklungsumgebung zu verwenden und unnötige Pakete im Produktcode zu verwalten. Tools wie autopep8 und pylint entsprechen dem, also installieren Sie es wie folgt.
pipenv install --dev autopep8 pylint
boto3
Die Python-Version des AWS SDK, boto3, ist in der laufenden Umgebung von Lambda vorinstalliert. Mit anderen Worten, wenn Sie boto3 in der Ausführungsumgebung verwenden möchten, installieren Sie boto3 als Entwicklungspaket, damit es nicht im Produktcode enthalten ist. Dies ist effektiv, da es die Zeit zum Laden des riesigen Codes von boto3 beim Kaltstart von Lambda verkürzt. Boto3 in der Ausführungsumgebung weist jedoch eine Schwachstelle auf, die der Benutzer nicht kontrollieren kann. Wenn AWS die Lambda-Ausführungsumgebung ändert, besteht immer das Risiko, dass sich die Version von boto3 in der Produktionsumgebung eines Tages plötzlich ändert. Wenn das Versions-Upgrade einen Bremswechsel beinhaltet, funktioniert es möglicherweise plötzlich nicht mehr. Außerdem ist boto3 in der Ausführungsumgebung eine etwas ältere Version des Moduls, sodass es nicht in Anwendungsfällen verwendet werden kann, in denen die neueste Version von boto3 erforderlich ist. Wenn Sie ein System betreiben, das rund um die Uhr läuft, wird empfohlen, boto3 in die Anwendung aufzunehmen, auch auf Kosten der Kaltstartleistung.
Dieses Mal werden wir ein Projekt erstellen, indem wir boto3 in die Anwendung aufnehmen. Installieren Sie das unten stehende Paket.
pipenv install boto3
Um die Lambda-Funktion bereitzustellen, müssen die erforderlichen Module einschließlich der abhängigen Pakete in ZIP komprimiert und hochgeladen werden. Der Prozess zum Konvertieren in ZIP ist wie folgt.
Zunächst ist die vorausgesetzte Projektstruktur wie folgt.
root
+ src
| + lambda_function.py
+ packing.py
+ Pipfile
+ Pipfile.lock
+ setup.py
__src Ordner __: Anwendung für Lambda-Funktion. Enthält den Lambda-Handler. packing.py: Code zum Packen von Lambda-Funktionen Pipfile: Pipenv-Konfigurationsdatei Pipfile.lock: Detaillierte Informationen zur mit pipenv erstellten Umgebung. Verwenden Sie diese Datei, um die Umgebung vollständig zu reproduzieren setup.py: Konfigurationsdatei zum Bereitstellen von Lambda-Funktionsanwendungen mit pip
Zunächst ist setup.py wie folgt. Dies ist eine Konfigurationsdatei zum Installieren einer Reihe von Apps im Ordner src mit dem Befehl pip, mit dem die Anwendung gepackt wird. Im Folgenden werden lambda_function.py und Pakete unter src
, falls vorhanden, installiert. Dies ist die Einstellung für die Installation von pip.
from setuptools import setup, find_packages
setup(
name="12factor",
version="1.0.0",
packages=find_packages(where='src'),
py_modules=['lambda_function'],
package_dir={'': 'src'},
)
Als nächstes lautet packing.py für die eigentliche Verpackung wie folgt. Ich schreibe in Python, damit ich in jeder Umgebung ZIP erstellen kann, ohne vom System abhängig zu sein. Der allgemeine Ablauf besteht darin, die erforderlichen Dateien in . Dist als temporären Ordner zu sammeln und sie zu komprimieren. Darüber hinaus wird dieses Programm nicht in der Entwicklungsumgebung ausgeführt, es wird jedoch davon ausgegangen, dass es in einer sauberen Umgebung ausgeführt wird, in der der Quellcode von git usw. bezogen wird. Ich verwende es zum Verpacken, indem ich vorübergehend eine virtuelle Umgebung von . Venv erstelle. Seien Sie vorsichtig, denn wenn Sie in der Entwicklungsumgebung eine virtuelle Umgebung von . Venv erstellen, wird diese zerstört.
pipfile.lock
definierten Pakete im ZIP-Ordner zu sammeln. Der Befehl pipenv sync reproduziert die Pakete originalgetreu und ist damit aus Sicht des "Abhängigkeitsmanagements" die am besten geeignete Lösung. Wenn Sie in der Umgebungsvariablen PIP_TARGET einen Ordner für ZIP angeben. pipenv sync Wenn Sie den Befehl ausführen, werden in diesem Ordner nur abhängige Pakete installiert.import os
import shutil
import subprocess
DISTINATION_FOLDER = '.dist'
if __name__ == '__main__':
#Erstellen Sie einen Ordner für ZIP
shutil.rmtree(DISTINATION_FOLDER, ignore_errors=True)
os.mkdir(DISTINATION_FOLDER)
#Ändern Sie den Ordner, in dem Pakete während der Pipenv-Synchronisierung gespeichert werden
os.environ['PIP_TARGET'] = DISTINATION_FOLDER
#Löschen, wenn bereits eine virtuelle Umgebung vorhanden ist
subprocess.call('pipenv --rm')
# pipfile.Reproduktion der virtuellen Umgebung aus dem Schloss
subprocess.call('pipenv sync')
#Installieren Sie den App-Code mit pip
subprocess.call('pip install -t {} .'.format(DISTINATION_FOLDER))
# ZIP
shutil.make_archive('lambda_function', 'zip', DISTINATION_FOLDER)
#Virtuelle Umgebung löschen
subprocess.call('pipenv --rm')
Als dritten Faktor übte ich Abhängigkeitsmanagementmethoden mit Python und Lambda. Ich denke, wie sensibel Sie mit Abhängigkeiten umgehen, hängt vom Projekt ab, aber ich hoffe, dass das hier vorgestellte Beispiel als Beispiel verwendet werden kann, wenn es am strengsten verwaltet wird.
Nächstes Mal "(4) Entwerfen, Erstellen, Freigeben, Ausführen / Erstellen, Freigeben, Ausführen - Trennen Sie die drei Phasen Erstellen, Freigeben und Ausführen streng voneinander". Inhaltsverzeichnis dieser Serie Tabelle aller Serien