Estensione del supporto per i servizi in bundle di App Engine: parte 1 (Modulo 17)

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

Sondaggio

Come utilizzerai questo tutorial?

Leggilo e basta Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Intermedio Avanzato

Come valuti la tua esperienza di utilizzo dei servizi Google Cloud?

Principiante Intermedio Avanzato

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:

  1. Configurazione/preparazione
  2. Aggiorna configurazione
  3. Modificare il codice dell'applicazione

3. Configurazione/preparazione

Questa sezione spiega come:

  1. Configura il progetto cloud
  2. Ottieni l'app di esempio di base
  3. (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.

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:

  1. Elimina la cartella lib, se presente, ed esegui: pip install -t lib -r requirements.txt per ripopolare lib. Se hai installato sia Python 2 che Python 3, potresti dover utilizzare il comando pip2.
  2. Assicurati di aver installato e inizializzato lo strumento a riga di comando gcloud e di averne esaminato l'utilizzo.
  3. Imposta il tuo progetto cloud con gcloud config set project PROJECT_ID se non vuoi inserire PROJECT_ID con ogni comando gcloud emesso.
  4. Esegui il deployment dell'app di esempio con gcloud app deploy
  5. Verifica che l'app del modulo 1 funzioni come previsto senza problemi di visualizzazione delle visite più recenti (illustrato di seguito)

a7a9d2b80d706a2b.png

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:

  1. Sostituisci la direttiva runtime con la release di Python 3 supportata; ad esempio, specifica python310 per Python 3.10.
  2. Elimina le direttive threadsafe e api_version, in quanto nessuna delle due viene utilizzata in Python 3.
  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 in handlers.
  4. Il runtime Python 3 non supporta le librerie di terze partiintegrate come il runtime Python 2. Se la tua app ha una sezione libraries in app.yaml, elimina l'intera sezione. I pacchetti richiesti devono essere elencati solo in requirements.txt come le librerie non integrate. La nostra app di esempio non ha una sezione libraries, quindi passa al passaggio successivo.
  5. Crea un set di direttive app_engine_apis impostato su true per utilizzarlo. Questa operazione corrisponde all'aggiunta del pacchetto SDK App Engine a requirements.txt sopra.

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 lib cartella

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:

a7a9d2b80d706a2b.png

Note finali

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/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • I link di archiviazione riportati sopra dipendono dalla tua PROJECT_ID e 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:

Passaggi successivi

Da qui puoi andare in diverse direzioni:

  1. Aggiorna il codice utilizzando i servizi in bundle che richiedono più modifiche al codice
  2. Esegui la migrazione dai servizi in bundle ai prodotti autonomi di Google Cloud
  3. 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

Module 1

code

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

Documenti generali di App Engine

Altre informazioni sul cloud

Video

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.