1. Panoramica
La serie di codelab Serverless Migration Station (esercitazioni pratiche e autonome) e i video correlati hanno lo scopo di aiutare gli sviluppatori serverless di Google Cloud a modernizzare le loro applicazioni guidandoli attraverso una o più migrazioni, principalmente abbandonando i servizi legacy. In questo modo, le tue app sono più portatili e hai più opzioni e flessibilità, il che ti consente di integrarti e accedere a una gamma più ampia di prodotti cloud e di eseguire più facilmente l'upgrade alle versioni più recenti del linguaggio. Sebbene inizialmente si concentri sui primi utenti di Cloud, principalmente gli sviluppatori di App Engine (ambiente standard), questa serie è abbastanza ampia da includere altre piattaforme serverless come Cloud Functions e Cloud Run o altrove, se applicabile.
In precedenza, gli sviluppatori dovevano eseguire la migrazione dai "servizi in bundle" legacy di App Engine, come Datastore e Memcache, prima di poter eseguire l'upgrade delle versioni del linguaggio, due operazioni potenzialmente impegnative una dopo l'altra. Rendendo disponibili molti dei principali servizi in bundle nel servizio App Engine di seconda generazione, gli sviluppatori possono ora eseguire il porting delle loro app ai runtime più recenti continuando a utilizzare (la maggior parte) dei servizi in bundle. Questo codelab ti guida nell'upgrade di un'app di esempio da Python 2 a 3 mantenendo l'utilizzo del servizio in bundle Datastore (tramite la libreria App Engine NDB). L'utilizzo della maggior parte dei servizi in bundle richiede solo un aggiornamento minore del codice, come verrà trattato in questo tutorial, ma ce ne sono altri che richiedono modifiche più estese, che verranno trattate nella "Parte 2", un modulo e un codelab di follow-up.
Imparerai a utilizzare
- Porta l'app di esempio App Engine da Python 2 a 3
- Aggiorna la configurazione dell'app in modo da includere l'SDK App Engine
- Aggiungi il codice SDK all'app che supporta i servizi in bundle negli ambienti di runtime di seconda generazione come Python 3
Che cosa ti serve
- Un progetto Google Cloud con un account di fatturazione Google Cloud attivo.
- Competenze di base di Python
- Conoscenza pratica dei comandi Linux più comuni
- Conoscenza di base dello sviluppo e del deployment di app App Engine
- Un'app App Engine del Modulo 1 funzionante (completa il codelab [consigliato] o copia l'app dal repository)
Sondaggio
Come utilizzerai questo tutorial?
Come valuteresti la tua esperienza con Python?
Come valuti la tua esperienza di utilizzo dei servizi Google Cloud?
2. Sfondo
Il servizio App Engine originale è stato lanciato nel 2008 e includeva un insieme di API legacy (ora note come servizi in bundle) per consentire agli sviluppatori di creare ed eseguire il deployment di applicazioni a livello globale. Questi servizi includono Datastore, Memcache e Task Queue. Sebbene comode, gli utenti hanno iniziato a preoccuparsi della portabilità delle loro app quando utilizzavano API proprietarie che le legavano ad App Engine e volevano che le loro app fossero più portatili. Questo, unito al fatto che molti di questi servizi in bundle sono diventati prodotti Cloud autonomi, ha portato il team di App Engine a lanciare la piattaforma di nuova generazione nel 2018 senza di loro.
Oggi gli sviluppatori Python 2 sono ansiosi di eseguire l'upgrade a Python 3. Un'app 2.x che utilizza servizi in bundle richiedeva la migrazione da questi servizi prima che le app potessero essere trasferite alla versione 3.x, il che rappresentava una coppia di migrazioni forzate consecutive, potenzialmente anche impegnative. Per facilitare questa transizione, il team di App Engine ha introdotto nell'autunno del 2021 un "wormhole" nel passato, che consente alle app in esecuzione su runtime di nuova generazione di accedere a molti di questi servizi in bundle. Sebbene questa release non includa tutti i servizi disponibili nei runtime originali, sono disponibili i principali, come Datastore, Task Queue e Memcache.
Questo codelab mostra le modifiche necessarie per eseguire l'upgrade dell'app a Python 3 mantenendo l'utilizzo dei servizi in bundle. L'obiettivo è far funzionare le tue app con i runtime più recenti, in modo da poter eseguire la migrazione dai servizi in bundle agli equivalenti autonomi di Cloud o ad alternative di terze parti secondo le tue tempistiche, anziché bloccare un upgrade alla versione 3.x. Sebbene la migrazione dai servizi in bundle non sia più obbligatoria, ti offre maggiore portabilità e flessibilità in termini di hosting delle app, inclusa la possibilità di passare a piattaforme che potrebbero servire meglio i tuoi workload o semplicemente rimanere su App Engine eseguendo l'upgrade a una versione del linguaggio più moderna, come appena descritto.
L'app di esempio Python 2 del modulo 1 utilizza il servizio integrato Datastore tramite App Engine NDB. L'app ha già eseguito la migrazione dei framework da webapp2 a Flask, completata nel codelab del modulo 1, ma con l'utilizzo di Datastore intatto.
Questo tutorial prevede i seguenti passaggi:
- Configurazione/preparazione
- Aggiorna configurazione
- Modificare il codice dell'applicazione
3. Configurazione/preparazione
Questa sezione spiega come:
- Configura il progetto cloud
- Ottieni l'app di esempio di base
- (R)esegui il deployment e convalida l'app di riferimento
Questi passaggi ti assicurano di iniziare con un codice funzionante.
1. Configura il progetto
Se hai completato il codelab del modulo 1, ti consigliamo di riutilizzare lo stesso progetto (e codice). In alternativa, crea un nuovo progetto Cloud o riutilizza un altro progetto esistente. Assicurati che il progetto abbia un account di fatturazione attivo in cui è stato abilitato il servizio App Engine.
2. Ottieni l'app di esempio di base
Uno dei prerequisiti per questo codelab è avere un'app App Engine del modulo 1 funzionante: completa il codelab del modulo 1 (consigliato) o copia l'app del modulo 1 dal repository. Che tu utilizzi il tuo o il nostro, il codice del Modulo 1 è il punto di "INIZIO". Questo codelab ti guida in ogni passaggio e si conclude con un codice simile a quello presente nella cartella "FINISH" del repository del modulo 7.
- INIZIO: Cartella Modulo 1 (Python 2)
- FINE: Cartella Modulo 1b (Python 3)
- Intero repository (per clonare o scaricare il file ZIP)
Indipendentemente dall'app del Modulo 1 che utilizzi, la cartella dovrebbe avere l'aspetto seguente, possibilmente anche con una cartella lib:
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. (Esegui di nuovo il deployment dell'app di base
Esegui i seguenti passaggi per (ri)eseguire il deployment dell'app Modulo 1:
- Elimina la cartella
lib, se presente, ed esegui:pip install -t lib -r requirements.txtper ripopolarelib. Se hai installato sia Python 2 che Python 3, potresti dover utilizzare il comandopip2. - Assicurati di aver installato e inizializzato lo strumento a riga di comando
gcloude di averne esaminato l'utilizzo. - Imposta il tuo progetto cloud con
gcloud config set projectPROJECT_IDse non vuoi inserirePROJECT_IDcon ogni comandogcloudemesso. - Esegui il deployment dell'app di esempio con
gcloud app deploy - Verifica che l'app del modulo 1 funzioni come previsto senza problemi di visualizzazione delle visite più recenti (illustrato di seguito)

4. Aggiorna configurazione
Una volta eseguiti correttamente questi passaggi e verificato il funzionamento della tua app web, puoi eseguire il porting di questa app a Python 3, a partire dalla configurazione.
Aggiungi l'SDK a requirements.txt
Il runtime Python 3 di App Engine riduce notevolmente l'overhead per l'utilizzo di librerie di terze parti. È sufficiente elencarli in requirements.txt. Per utilizzare i servizi in bundle in Python 3, aggiungi il pacchetto SDK App Engine, appengine-python-standard. Il pacchetto SDK si unisce a Flask dal modulo 1:
flask
appengine-python-standard
Aggiorna app.yaml
Segui i passaggi riportati di seguito per applicare le modifiche alla configurazione al file app.yaml:
- Sostituisci la direttiva
runtimecon la release di Python 3 supportata; ad esempio, specificapython310per Python 3.10. - Elimina le direttive
threadsafeeapi_version, in quanto nessuna delle due viene utilizzata in Python 3. - Elimina completamente la sezione
handlers, poiché questa app ha solo gestori di script. Se la tua app ha gestori di file statici, lasciali intatti inhandlers. - Il runtime Python 3 non supporta le librerie di terze partiintegrate come il runtime Python 2. Se la tua app ha una sezione
librariesinapp.yaml, elimina l'intera sezione. I pacchetti richiesti devono essere elencati solo inrequirements.txtcome le librerie non integrate. La nostra app di esempio non ha una sezionelibraries, quindi passa al passaggio successivo. - Crea un set di direttive
app_engine_apisimpostato sutrueper utilizzarlo. Questa operazione corrisponde all'aggiunta del pacchetto SDK App Engine arequirements.txtsopra.
Riepilogo delle modifiche necessarie da apportare a app.yaml:
PRIMA:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
DOPO:
runtime: python310
app_engine_apis: true
Altri file di configurazione
Poiché tutti i pacchetti di terze parti devono essere elencati solo in requirements.txt, a meno che tu non abbia qualcosa di speciale in appengine_config.py, non è necessario, quindi eliminalo. Allo stesso modo, poiché tutte le librerie di terze parti vengono installate automaticamente durante il processo di compilazione, non è necessario copiarle o venderle, il che significa che non sono più necessari il comando pip install né la cartella lib, quindi eliminala. Riepilogo in corso:
- Elimina il file
appengine_config.py - Elimina
libcartella
Con questo passaggio si concludono tutte le modifiche alla configurazione necessarie.
5. Modificare il codice dell'applicazione
Per accedere alla maggior parte dei servizi in bundle disponibili nell'ambiente di runtime Python 3 è necessario un breve frammento di codice che racchiuda l'oggetto applicazione Web Server Gateway Interface (WSGI) in main.py. La funzione wrapper è google.appengine.api.wrap_wsgi_app() e la utilizzi importandola e racchiudendo l'oggetto WSGI. Apporta le modifiche riportate di seguito per riflettere l'aggiornamento richiesto per Flask in main.py:
PRIMA:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
DOPO:
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)
Per esempi di wrapping WSGI per altri framework Python, consulta la documentazione.
Sebbene questo esempio funzioni per dare alla tua app l'accesso alla maggior parte dei servizi in bundle in Python 3, altri come Blobstore e Mail richiedono codice aggiuntivo. Esamineremo questi campioni in un altro modulo sulla migrazione.
Con questo si concludono tutte le modifiche necessarie per aggiungere l'utilizzo dei servizi in bundle di App Engine all'app di esempio del modulo 1. L'applicazione è già compatibile con Python 2 e 3, quindi non sono necessarie modifiche aggiuntive per il porting a Python 3, a parte quelle già apportate alla configurazione. Il passaggio finale: esegui il deployment di questa app modificata nel runtime Python 3 di nuova generazione di App Engine e conferma che gli aggiornamenti siano stati eseguiti correttamente.
6. Riepilogo/Pulizia
Questa sezione conclude il codelab eseguendo il deployment dell'app, verificando che funzioni come previsto e in qualsiasi output riflesso. Dopo la convalida dell'app, esegui la pulizia e valuta i passaggi successivi.
Esegui il deployment e verifica l'applicazione
Esegui il deployment dell'app Python 3 con gcloud app deploy e verifica che funzioni come in Python 2. Nessuna funzionalità cambia, quindi l'output dovrebbe essere identico a quello dell'app del Modulo 1:

Note finali
- Confronta ciò che hai con ciò che si trova nella cartella Modulo 1b (FINE) se hai commesso un errore lungo il percorso e apporta le modifiche necessarie.
- Confronta il Modulo 0
main.pyaffiancato al Modulo 1bmain.pyin questa pagina. Se la tua app utilizza ancorawebapp2, segui il codelab del Modulo 1 per scoprire come eseguire la migrazione dawebapp2a Flask.
Congratulazioni per aver fatto il primo passo per il porting delle tue app Python 2 App Engine a Python 3 mantenendo al momento l'utilizzo dei servizi in bundle.
Esegui la pulizia
Generale
Se hai finito per il momento, ti consigliamo di disattivare l'app App Engine per evitare addebiti. Tuttavia, se vuoi fare altri test o esperimenti, la piattaforma App Engine ha una quota senza costi e, finché non superi questo livello di utilizzo, non ti verranno addebitati costi. Questo vale per il calcolo, ma potrebbero essere addebitati anche costi per i servizi App Engine pertinenti, quindi consulta la pagina dei prezzi per ulteriori informazioni. Se questa migrazione coinvolge altri servizi cloud, questi vengono fatturati separatamente. In entrambi i casi, se applicabile, consulta la sezione "Specifiche per questo codelab" di seguito.
Per una divulgazione completa, il deployment su una piattaforma di calcolo serverless di Google Cloud come App Engine comporta costi di build e archiviazione minimi. Cloud Build ha una propria quota senza costi, così come Cloud Storage. L'archiviazione di questa immagine utilizza parte della quota. Tuttavia, potresti vivere in una regione che non dispone di un livello senza costi, quindi tieni sotto controllo l'utilizzo dello spazio di archiviazione per ridurre al minimo i potenziali costi. Le "cartelle" Cloud Storage specifiche che devi esaminare includono:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- I link di archiviazione riportati sopra dipendono dalla tua
PROJECT_IDe dalla tua *LOC*, ad esempio "us" se la tua app è ospitata negli Stati Uniti.
D'altra parte, se non intendi continuare con questa applicazione o con altri codelab di migrazione correlati e vuoi eliminare tutto completamente, chiudi il progetto.
Specifico per questo codelab
I servizi elencati di seguito sono univoci per questo codelab. Per saperne di più, consulta la documentazione di ogni prodotto:
- Il servizio App Engine Datastore è fornito da Cloud Datastore (Cloud Firestore in modalità Datastore), che dispone anche di un livello senza costi. Per ulteriori informazioni, consulta la pagina dei prezzi.
Passaggi successivi
Da qui puoi andare in diverse direzioni:
- Aggiorna il codice utilizzando i servizi in bundle che richiedono più modifiche al codice
- Esegui la migrazione dai servizi in bundle ai prodotti autonomi di Google Cloud
- Esegui la migrazione da App Engine a un'altra piattaforma serverless di Cloud
L'accesso ad altri servizi in bundle come Blobstore, Mail e Deferred richiede ulteriori modifiche al codice. I moduli di migrazione incentrati sull'abbandono dei servizi in bundle legacy di App Engine da prendere in considerazione includono:
- Modulo 2: da App Engine NDB a Cloud NDB
- Moduli 7-9: da App Engine TaskQueue (attività push) a Cloud Tasks
- Moduli 12-13: da Memcache App Engine a Cloud Memorystore
- Moduli 15-16: App Engine Blobstore a Cloud Storage
- Moduli 18-19: App Engine TaskQueue (attività pull) a Cloud Pub/Sub
App Engine non è più l'unica piattaforma serverless in Google Cloud. Se hai una piccola app App Engine o una con funzionalità limitate e vuoi trasformarla in un microservizio autonomo oppure vuoi suddividere un'app monolitica in più componenti riutilizzabili, questi sono buoni motivi per prendere in considerazione il passaggio a Cloud Functions. Se la containerizzazione è diventata parte del flusso di lavoro di sviluppo delle applicazioni, in particolare se consiste in una pipeline CI/CD (integrazione continua/distribuzione continua o deployment continuo), valuta la migrazione a Cloud Run. Questi scenari sono trattati nei seguenti moduli:
- Esegui la migrazione da App Engine a Cloud Functions: consulta il modulo 11
- Esegui la migrazione da App Engine a Cloud Run: consulta il modulo 4 per inserire la tua app in un container con Docker o il modulo 5 per farlo senza container, conoscenze di Docker o
Dockerfiles
Il passaggio a un'altra piattaforma serverless è facoltativo e ti consigliamo di valutare le opzioni migliori per le tue app e i tuoi casi d'uso prima di apportare modifiche.
Indipendentemente dal modulo di migrazione che prenderai in considerazione, tutti i contenuti di Serverless Migration Station (codelab, video, codice sorgente [se disponibile]) sono accessibili nel relativo repository open source. Il repository README fornisce anche indicazioni sulle migrazioni da prendere in considerazione e sull'eventuale "ordine" dei moduli di migrazione pertinenti.
7. Risorse aggiuntive
Di seguito sono elencate risorse aggiuntive per gli sviluppatori che vogliono esplorare ulteriormente questo modulo di migrazione o quelli correlati, nonché i prodotti correlati. Sono inclusi i luoghi in cui fornire feedback su questi contenuti, i link al codice e vari documenti che potresti trovare utili.
Problemi/feedback relativi ai codelab
Se riscontri problemi con questo codelab, cerca prima il tuo problema prima di presentare una segnalazione. Link per cercare e creare nuovi problemi:
Risorse per la migrazione
I link alle cartelle del repository per il Modulo 1 (INIZIO) e il Modulo 1b (FINE) sono riportati nella tabella seguente. Puoi accedervi anche dal repository per tutte le migrazioni dei codelab di App Engine.
Codelab | Python 2 | Python 3 |
N/A | ||
Modulo 17 (questo codelab) | N/A | code (mod1b-flask) |
Risorse online
Di seguito sono riportate risorse online che potrebbero essere pertinenti per questo tutorial:
Servizi integrati di App Engine
- Accesso ai servizi in bundle nel runtime Python 3 di nuova generazione
- Confronto affiancato dell'app del modulo 0 (Python 2) e dell'app del modulo 1b (Python 3)
- Esempi di wrapper di oggetti WSGI del framework web dell'SDK App Engine
- Supporto per i servizi integrati di App Engine nel lancio degli ambienti di runtime di nuova generazione (2021)
Documenti generali di App Engine
- Documentazione di App Engine
- Runtime Python 2 App Engine (ambiente standard)
- Utilizzo delle librerie integrate di App Engine su Python 2 App Engine
- Runtime Python 3 App Engine (ambiente standard)
- Differenze tra i runtime di Python 2 e 3 di App Engine (ambiente standard)
- Guida alla migrazione da Python 2 a 3 di App Engine (ambiente standard)
- Informazioni su prezzi e quote di App Engine
- Lancio della piattaforma App Engine di seconda generazione (2018)
- Supporto a lungo termine per i runtime legacy
- Repository di esempi di migrazione della documentazione
- Repository di esempi di migrazione forniti dalla community
Altre informazioni sul cloud
- Python su Google Cloud Platform
- Librerie client Python di Google Cloud
- Livello "Sempre senza costi" di Google Cloud
- Google Cloud SDK (strumento a riga di comando
gcloud) - Tutta la documentazione di Google Cloud
Video
- Serverless Migration Station
- Serverless Expeditions
- Iscriviti a Google Cloud Tech
- Iscriviti a Google Developers
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.