[PYTHON] Lernen Sie von „Beyond the Twelve-Factor App“ und „The Twelve-Factor App“ und üben Sie AWS (3) Abhängigkeitsmanagement / Abhängigkeiten - Deklarieren und trennen Sie Abhängigkeiten explizit

Kommentar

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. ..

Trainieren

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.

  1. Installieren Sie pipenv.
pip install pipenv
  1. Fügen Sie Einstellungen hinzu, damit die von pipenv erstellte virtuelle Umgebung im Ordner direkt unter dem Projekt abgelegt werden kann. Fügen Sie den Umgebungsvariablen Folgendes hinzu.
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.

  1. Initialisieren Sie das Projekt.
pipenv --python 3.8

Die Pipfile Datei und der .venv Ordner werden direkt unter dem Projektordner erstellt und Sie können loslegen.

Entwicklungspaket

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

Lambda-Funktionsverpackung

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.

  1. Erstellen Sie einen Ordner für die Komprimierung
  2. Fügen Sie die von pipenv verwaltete Paketdatei zum Komprimierungsordner hinzu
  3. Fügen Sie die App zum Komprimierungsordner hinzu
  4. ZIP

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.

  1. Erstellen Sie einen Ordner für ZIP. Da kein Müll mehr vorhanden sein sollte, löschen Sie ihn zuerst und erstellen Sie dann einen Ordner.
  2. Verwenden Sie den Befehl pipenv sync, um die in 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.
  3. Installieren Sie die Anwendung im ZIP-Ordner mit dem Befehl pip instaa -t .dist .__.
  4. Erstellen Sie abschließend eine ZIP-Datei. Sie können diese Datei lambda_function.zip verwenden, um sie auf Lambda bereitzustellen.
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')
    

Zusammenfassung

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

Recommended Posts

Lernen Sie von „Beyond the Twelve-Factor App“ und „The Twelve-Factor App“ und üben Sie AWS (3) Abhängigkeitsmanagement / Abhängigkeiten - Deklarieren und trennen Sie Abhängigkeiten explizit