1. Übersicht
Die Codelabs der Reihe „Serverless Migration Station“ (selbstgesteuerte, praktische Anleitungen) und die zugehörigen Videos sollen serverlosen Google Cloud-Entwicklern helfen, ihre Anwendungen zu modernisieren. Dazu werden sie durch eine oder mehrere Migrationen geführt, bei denen es in erster Linie darum geht, von Legacy-Diensten wegzukommen. Dadurch werden Ihre Apps portierbarer und Sie erhalten mehr Optionen und Flexibilität. Sie können eine größere Auswahl an Cloud-Produkten einbinden und darauf zugreifen und einfacher auf neuere Sprachversionen upgraden. Die Reihe konzentriert sich zwar anfangs auf die ersten Cloud-Nutzer, vor allem auf App Engine-Entwickler (Standardumgebung), ist aber breit genug, um auch andere serverlose Plattformen wie Cloud Functions und Cloud Run oder andere Plattformen einzubeziehen, sofern zutreffend.
Bisher mussten Entwickler von den alten „gebündelten Diensten“ von App Engine wie Datastore und Memcache migrieren, bevor sie Sprachversionen aktualisieren konnten. Das waren zwei potenziell schwierige Aufgaben direkt nacheinander. Da viele der wichtigsten gebündelten Dienste im App Engine-Dienst der 2. Generation verfügbar sind, können Entwickler ihre Anwendungen jetzt auf die neuesten Laufzeiten portieren und gleichzeitig (die meisten) der gebündelten Dienste weiterhin verwenden. In diesem Codelab wird gezeigt, wie Sie eine Beispielanwendung von Python 2 auf Python 3 aktualisieren und dabei den gebündelten Datastore-Dienst (über die App Engine NDB-Bibliothek) beibehalten. Für die meisten gebündelten Dienste ist nur eine geringfügige Aktualisierung des Codes erforderlich, wie in diesem Tutorial beschrieben. Für andere sind umfangreichere Änderungen erforderlich, die in „Teil 2“, einem Folgemodul und Codelab, behandelt werden.
Lerninhalte
- Beispiel-App Engine-App von Python 2 zu Python 3 portieren
- App-Konfiguration aktualisieren, um das App Engine SDK einzuschließen
- SDK-Code zur App hinzufügen, der gebündelte Dienste in Laufzeiten der 2. Generation wie Python 3 unterstützt
Voraussetzungen
- Ein Google Cloud-Projekt mit einem aktiven GCP-Rechnungskonto
- Grundlegende Python-Kenntnisse
- Grundkenntnisse zu gängigen Linux-Befehlen
- Grundlegende Kenntnisse zur Entwicklung und Bereitstellung von App Engine-Anwendungen
- Eine funktionierende App Engine-App für Modul 1 (Code-Lab durcharbeiten [empfohlen] oder die App aus dem Repository kopieren)
Umfrage
Wie werden Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit Python bewerten?
Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?
2. Hintergrund
Der ursprüngliche App Engine-Dienst wurde 2008 eingeführt und enthielt eine Reihe von Legacy-APIs (jetzt als gebündelte Dienste bezeichnet), um Entwicklern das Erstellen und Bereitstellen von Anwendungen weltweit zu erleichtern. Dazu gehören Datastore, Memcache und Task Queue. Das war zwar praktisch, aber Nutzer machten sich Sorgen um die Portabilität ihrer Apps, wenn sie proprietäre APIs verwendeten, die sie an App Engine banden. Sie wollten, dass ihre Apps portabler sind. Da viele dieser gebündelten Dienste zu eigenständigen Cloud-Produkten weiterentwickelt wurden, wurde 2018 die Plattform der nächsten Generation ohne sie eingeführt.
Heute sind Python 2-Entwickler bestrebt, ein Upgrade auf Python 3 durchzuführen. Bei einer 2.x-App, die gebündelte Dienste verwendet, war eine Migration von diesen Diensten erforderlich, bevor die Apps auf 3.x portiert werden konnten. Dies bedeutete zwei aufeinanderfolgende, möglicherweise schwierige, erzwungene Migrationen. Um diesen Übergang zu erleichtern, hat das App Engine-Team im Herbst 2021 ein „Wurmloch“ in die Vergangenheit eingeführt, über das Anwendungen, die in Laufzeiten der nächsten Generation ausgeführt werden, auf viele dieser gebündelten Dienste zugreifen können. Diese Version enthält zwar nicht alle in den ursprünglichen Runtimes verfügbaren Dienste, aber wichtige Dienste wie Datastore, Task Queue und Memcache sind verfügbar.
In diesem Codelab werden die erforderlichen Änderungen gezeigt, die Sie vornehmen müssen, um Ihre App auf Python 3 zu aktualisieren und gleichzeitig die Verwendung gebündelter Dienste beizubehalten. Ziel ist es, Ihre Apps in den neuesten Laufzeiten auszuführen. So können Sie die gebündelten Dienste in Ihrem eigenen Tempo durch eigenständige Cloud-Äquivalente oder Drittanbieteralternativen ersetzen, anstatt dass dies ein Hindernis für ein Upgrade auf 3.x ist. Die Migration von gebündelten Diensten ist zwar nicht mehr erforderlich, bietet Ihnen aber mehr Portabilität und Flexibilität in Bezug auf den Hostingort Ihrer Anwendungen. Sie können beispielsweise zu Plattformen wechseln, die Ihre Arbeitslasten besser unterstützen, oder einfach in App Engine bleiben und wie oben beschrieben auf eine modernere Sprachversion upgraden.
In der Python 2-Beispielanwendung aus Modul 1 wird der gebündelte Datastore-Dienst über App Engine NDB verwendet. Die App hat bereits Frameworks von webapp2 zu Flask migriert. Das wurde im Codelab zu Modul 1 abgeschlossen. Die Datastore-Nutzung ist jedoch unverändert.
Diese Anleitung umfasst die folgenden Schritte:
- Einrichtung/Vorbereitung
- Konfiguration aktualisieren
- Anwendungscode ändern
3. Einrichtung/Vorbereitung
In diesem Abschnitt wird Folgendes erläutert:
- Cloud-Projekt einrichten
- Beispiel-App für die Baseline abrufen
- Ausgangsanwendung (neu) bereitstellen und validieren
Mit diesen Schritten stellen Sie sicher, dass Sie mit funktionierendem Code beginnen.
1. Projekt einrichten
Wenn Sie das Codelab zu Modul 1 abgeschlossen haben, empfehlen wir, dasselbe Projekt (und denselben Code) wiederzuverwenden. Alternativ können Sie ein völlig neues Cloud-Projekt erstellen oder ein anderes vorhandenes Projekt wiederverwenden. Prüfen Sie, ob das Projekt ein aktives Rechnungskonto hat, in dem der App Engine-Dienst aktiviert wurde.
2. Beispiel-App für die Baseline abrufen
Eine der Voraussetzungen für dieses Codelab ist eine funktionierende App Engine-App aus Modul 1. Führen Sie das Codelab zu Modul 1 aus (empfohlen) oder kopieren Sie die App aus Modul 1 aus dem Repository. Unabhängig davon, ob Sie Ihren oder unseren Code verwenden, ist der Code aus Modul 1 der Ausgangspunkt. In diesem Codelab werden Sie durch jeden Schritt geführt. Am Ende erhalten Sie Code, der dem im Repo-Ordner „FINISH“ von Modul 7 ähnelt.
- START: Ordner für Modul 1 (Python 2)
- ABSCHLUSS: Ordner für Modul 1b (Python 3)
- Gesamtes Repository (zum Klonen oder Herunterladen einer ZIP-Datei)
Unabhängig davon, welche App aus Modul 1 Sie verwenden, sollte der Ordner so aussehen wie unten, möglicherweise auch mit einem lib-Ordner:
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. Referenz-App (erneut) bereitstellen
Führen Sie die folgenden Schritte aus, um die App aus Modul 1 (neu) bereitzustellen:
- Löschen Sie den Ordner
lib, falls er vorhanden ist, und führen Siepip install -t lib -r requirements.txtaus, umlibneu zu füllen. Wenn Sie sowohl Python 2 als auch Python 3 installiert haben, müssen Sie möglicherweise stattdessen den Befehlpip2verwenden. - Achten Sie darauf, dass Sie das
gcloud-Befehlszeilentool installiert und initialisiert haben und sich mit der Verwendung vertraut gemacht haben. - Legen Sie Ihr Cloud-Projekt mit
gcloud config set projectPROJECT_IDfest, wenn Sie IhrePROJECT_IDnicht bei jedem ausgeführtengcloud-Befehl eingeben möchten. - Beispiel-App mit
gcloud app deploybereitstellen - Prüfen Sie, ob die App aus Modul 1 wie erwartet ausgeführt wird und die letzten Besuche ohne Probleme angezeigt werden (siehe unten).

4. Konfiguration aktualisieren
Sobald Sie diese Schritte erfolgreich ausgeführt haben und Ihre Webanwendung funktioniert, können Sie sie zu Python 3 portieren. Beginnen Sie mit der Konfiguration.
SDK zu „requirements.txt“ hinzufügen
Die App Engine-Python 3-Laufzeitumgebung reduziert den Aufwand für die Verwendung von Drittanbieterbibliotheken erheblich. Es reicht aus, sie in requirements.txt aufzulisten. Wenn Sie die gebündelten Dienste in Python 3 verwenden möchten, fügen Sie das App Engine SDK-Paket appengine-python-standard hinzu. Das SDK-Paket wird in Modul 1 zu Flask hinzugefügt:
flask
appengine-python-standard
app.yaml aktualisieren
Führen Sie die folgenden Schritte aus, um Konfigurationsänderungen auf Ihre app.yaml-Datei anzuwenden:
- Ersetzen Sie die
runtime-Anweisung durch die unterstützte Python 3-Version. Geben Sie beispielsweisepython310für Python 3.10 an. - Löschen Sie sowohl die
threadsafe- als auch dieapi_version-Anweisung, da beide in Python 3 nicht verwendet werden. - Löschen Sie den Abschnitt
handlersvollständig, da diese App nur Skript-Handler hat. Wenn Ihre App Handler für statische Dateien hat, lassen Sie sie inhandlersunverändert. - Die Python 3-Laufzeit unterstützt keine integrierten Drittanbieterbibliotheken wie die Python 2-Laufzeit. Wenn Ihre App in
app.yamleinen Abschnittlibrarieshat, löschen Sie den gesamten Abschnitt. Erforderliche Pakete müssen nur inrequirements.txtaufgeführt werden, genau wie nicht integrierte Bibliotheken. Unsere Beispiel-App hat keinenlibraries-Abschnitt. Fahren Sie mit dem nächsten Schritt fort. - Erstellen Sie eine
app_engine_apis-Anweisung, die auftruefestgelegt ist, um sie zu verwenden. Dies entspricht dem Hinzufügen des App Engine SDK-Pakets zurequirements.txtoben.
Zusammenfassung der erforderlichen Änderungen an app.yaml:
VORHER:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
DANACH:
runtime: python310
app_engine_apis: true
Andere Konfigurationsdateien
Da alle Drittanbieterpakete nur in requirements.txt aufgeführt werden müssen, ist appengine_config.py nicht erforderlich, sofern Sie dort nichts Besonderes haben. Löschen Sie die Datei daher. Da alle Drittanbieterbibliotheken während des Build-Prozesses automatisch installiert werden, müssen sie auch nicht kopiert oder eingebunden werden. Das bedeutet, dass es weder den Befehl pip install noch den Ordner lib gibt. Löschen Sie ihn also. Zusammenfassen:
- Datei „
appengine_config.py“ löschen lib-Ordner löschen
Damit sind alle erforderlichen Konfigurationsänderungen abgeschlossen.
5. Anwendungscode ändern
Für den Zugriff auf die meisten der verfügbaren gebündelten Dienste in der Python 3-Laufzeitumgebung ist ein kurzer Codeabschnitt erforderlich, der das Web Server Gateway Interface (WSGI)-Anwendungsobjekt in main.py umschließt. Die Wrapper-Funktion ist google.appengine.api.wrap_wsgi_app(). Sie verwenden sie, indem Sie sie importieren und Ihr WSGI-Objekt damit umschließen. Nehmen Sie die folgenden Änderungen vor, um die erforderliche Aktualisierung für Flask in main.py zu berücksichtigen:
VORHER:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
DANACH:
from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
Beispiele für WSGI-Wrapping für andere Python-Frameworks finden Sie in der Dokumentation.
Dieses Beispiel funktioniert, um Ihrer App Zugriff auf die meisten gebündelten Dienste in Python 3 zu gewähren. Für andere Dienste wie Blobstore und Mail ist jedoch zusätzlicher Code erforderlich. Diese Beispiele werden in einem anderen Migrationsmodul behandelt.
Damit sind alle erforderlichen Änderungen abgeschlossen, um die Verwendung von gebündelten App Engine-Diensten in die Beispielanwendung aus Modul 1 aufzunehmen. Die Anwendung ist bereits mit Python 2 und 3 kompatibel. Daher sind keine zusätzlichen Änderungen erforderlich, um sie zu Python 3 zu portieren. Im letzten Schritt müssen Sie diese geänderte App in der App Engine-Python 3-Laufzeit der nächsten Generation bereitstellen und bestätigen, dass die Aktualisierungen erfolgreich waren.
6. Zusammenfassung/Bereinigung
In diesem Abschnitt wird das Codelab abgeschlossen, indem die App bereitgestellt und geprüft wird, ob sie wie vorgesehen funktioniert und ob die Ausgabe korrekt ist. Führen Sie nach der App-Validierung alle erforderlichen Bereinigungen durch und überlegen Sie sich die nächsten Schritte.
Anwendung bereitstellen und überprüfen
Stellen Sie die Python 3-App mit gcloud app deploy bereit und prüfen Sie, ob sie wie in Python 2 funktioniert. Die Funktionalität ändert sich nicht, daher sollte die Ausgabe mit der App aus Modul 1 identisch sein:

Abschließende Hinweise
- Vergleiche deine Lösung mit den Inhalten im Ordner „Modul 1b“ (FINISH) und nimm bei Bedarf Anpassungen vor.
- Vergleichen Sie Modul 0
main.pyund Modul 1bmain.pyauf dieser Seite. Wenn Ihre App weiterhinwebapp2verwendet, führen Sie das Codelab zu Modul 1 aus, um zu erfahren, wie Sie vonwebapp2zu Flask migrieren.
Herzlichen Glückwunsch, dass Sie den ersten Schritt zur Portierung Ihrer Python 2-App Engine-Anwendungen zu Python 3 unternommen haben und die gebündelten Dienste weiterhin verwenden.
Bereinigen
Allgemein
Wenn Sie die App vorerst nicht mehr benötigen, empfehlen wir Ihnen, sie zu deaktivieren, um Abrechnungen zu vermeiden. Wenn Sie jedoch weitere Tests durchführen möchten, bietet die App Engine-Plattform ein kostenloses Kontingent. Solange Sie diese Nutzungsebene nicht überschreiten, werden Ihnen keine Gebühren berechnet. Das gilt für die Rechenleistung. Es können aber auch Gebühren für relevante App Engine-Dienste anfallen. Weitere Informationen finden Sie auf der Preisseite. Wenn bei dieser Migration andere Cloud-Dienste beteiligt sind, werden diese separat abgerechnet. Sehen Sie sich in beiden Fällen gegebenenfalls den Abschnitt „Spezifisch für dieses Codelab“ unten an.
Die Bereitstellung auf einer serverlosen Google Cloud-Compute-Plattform wie App Engine verursacht geringe Build- und Speicherkosten. Cloud Build und Cloud Storage haben jeweils ein eigenes kostenloses Kontingent. Das Speichern dieses Bildes verbraucht einen Teil dieses Kontingents. Möglicherweise leben Sie jedoch in einer Region, in der es kein solches kostenloses Kontingent gibt. Achten Sie daher auf Ihre Speichernutzung, um potenzielle Kosten zu minimieren. Folgende Cloud Storage-„Ordner“ sollten Sie sich ansehen:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Die oben genannten Speicherlinks hängen von Ihrem
PROJECT_IDund *LOC*ab, z. B. „us“, wenn Ihre App in den USA gehostet wird.
Wenn Sie diese Anwendung oder andere zugehörige Migrations-Codelabs nicht weiter verwenden und alles vollständig löschen möchten, beenden Sie Ihr Projekt.
Spezifisch für dieses Codelab
Die unten aufgeführten Dienste sind nur für dieses Codelab verfügbar. Weitere Informationen finden Sie in der Dokumentation der einzelnen Produkte:
- Der Dienst App Engine Datastore wird von Cloud Datastore (Cloud Firestore im Datastore-Modus) bereitgestellt, das ebenfalls eine kostenlose Stufe bietet. Weitere Informationen finden Sie auf der Preisseite.
Nächste Schritte
Es gibt mehrere Möglichkeiten, wie Sie nun vorgehen können:
- Code mit gebündelten Diensten aktualisieren, die mehr Codeänderungen erfordern
- Von gebündelten Diensten zu eigenständigen Cloud-Produkten migrieren
- Von App Engine zu einer anderen serverlosen Cloud-Plattform migrieren
Für den Zugriff auf andere gebündelte Dienste wie Blobstore, Mail und Deferred sind weitere Codeänderungen erforderlich. Folgende Migrationsmodule sind für die Migration von gebündelten App Engine-Legacy-Diensten relevant:
- Modul 2: App Engine NDB zu Cloud NDB
- Module 7–9: App Engine TaskQueue (Push-Aufgaben) zu Cloud Tasks
- Module 12–13: App Engine Memcache zu Cloud Memorystore
- Module 15–16: App Engine Blobstore zu Cloud Storage
- Module 18–19: App Engine TaskQueue (Pull-Aufgaben) zu Cloud Pub/Sub
App Engine ist nicht mehr die einzige serverlose Plattform in Google Cloud. Wenn Sie eine kleine App Engine-Anwendung oder eine Anwendung mit eingeschränkter Funktionalität haben und sie in einen eigenständigen Mikrodienst umwandeln möchten oder eine monolithische Anwendung in mehrere wiederverwendbare Komponenten aufteilen möchten, sind dies gute Gründe für einen Wechsel zu Cloud Functions. Wenn die Containerisierung Teil Ihres Anwendungsentwicklungs-Workflows geworden ist, insbesondere wenn er aus einer CI/CD-Pipeline (Continuous Integration/Continuous Delivery oder Deployment) besteht, sollten Sie eine Migration zu Cloud Run in Betracht ziehen. Diese Szenarien werden in den folgenden Modulen behandelt:
- Von App Engine zu Cloud Functions migrieren: Modul 11
- Von App Engine zu Cloud Run migrieren: Modul 4 enthält Informationen zum Containerisieren Ihrer App mit Docker und Modul 5 zum Containerisieren ohne Container, Docker-Kenntnisse oder
Dockerfiles.
Der Wechsel zu einer anderen serverlosen Plattform ist optional. Wir empfehlen, die besten Optionen für Ihre Apps und Anwendungsfälle zu prüfen, bevor Sie Änderungen vornehmen.
Unabhängig davon, welches Migrationsmodul Sie als Nächstes in Betracht ziehen, können Sie auf alle Serverless Migration Station-Inhalte (Codelabs, Videos, Quellcode [sofern verfügbar]) über das zugehörige Open-Source-Repository zugreifen. Das README des Repositorys enthält auch Informationen dazu, welche Migrationen infrage kommen und welche Reihenfolge der Migrationsmodule relevant ist.
7. Zusätzliche Ressourcen
Unten finden Sie weitere Ressourcen für Entwickler, die sich näher mit diesem oder einem ähnlichen Migrationsmodul sowie mit zugehörigen Produkten befassen möchten. Dazu gehören Orte, an denen Sie Feedback zu diesen Inhalten geben können, Links zum Code und verschiedene Dokumentationen, die für Sie nützlich sein könnten.
Probleme mit Codelabs/Feedback
Wenn Sie Probleme mit diesem Codelab feststellen, suchen Sie bitte zuerst nach Ihrem Problem, bevor Sie es melden. Links zum Suchen und Erstellen neuer Probleme:
Migrationsressourcen
Links zu den Repository-Ordnern für Modul 1 (START) und Modul 1b (FINISH) finden Sie in der Tabelle unten. Sie können auch über das Repository für alle App Engine-Codelab-Migrationen auf sie zugreifen.
Codelab | Python 2 | Python 3 |
– | ||
Modul 17 (dieses Codelab) | – | code (mod1b-flask) |
Onlineressourcen
Unten finden Sie Online-Ressourcen, die für diese Anleitung relevant sein könnten:
Gebündelte App Engine-Dienste
- Auf gebündelte Dienste in der Python 3-Laufzeit der nächsten Generation zugreifen
- Vergleich von Modul 0-Apps (Python 2) und Modul 1b-Apps (Python 3)
- App Engine SDK-Webframework – Beispiele für WSGI-Objekt-Wrapper
- Einführung der Unterstützung für gebündelte App Engine-Dienste in Laufzeiten der nächsten Generation (2021)
Allgemeine App Engine-Dokumentation
- App Engine-Dokumentation
- Python 2-Laufzeit für die App Engine-Standardumgebung
- Integrierte App Engine-Bibliotheken in Python 2 App Engine verwenden
- Python 3-Laufzeit für die App Engine-Standardumgebung
- Unterschiede zwischen den Python 2- und Python 3-Laufzeiten in App Engine (Standardumgebung)
- Migrationsanleitung für App Engine (Standardumgebung) von Python 2 zu Python 3
- Informationen zu Preisen und Kontingenten für App Engine
- Einführung der App Engine-Plattform der zweiten Generation (2018)
- Langfristiger Support für ältere Laufzeiten
- Repository mit Migrationsbeispielen für die Dokumentation
- Repository der Migrationsbeispiele der Community
Andere Cloud-Informationen
- Python auf der Google Cloud Platform
- Google Cloud Python-Clientbibliotheken
- Kostenlose Stufe von Google Cloud
- Google Cloud SDK (
gcloud-Befehlszeilentool) - Gesamte Google Cloud-Dokumentation
Videos
- Serverless Migration Station
- Serverless Expeditions
- Google Cloud Tech abonnieren
- Google Developers abonnieren
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.