Introduzione a Cloud Run con Python

1. Introduzione

96d07289bb51daa7.png

Cloud Run è una piattaforma gestita di computing che consente di eseguire container stateless richiamabili tramite richieste HTTP. È basato sul progetto open source Knative, consentendo la portabilità dei tuoi carichi di lavoro tra piattaforme. Cloud Run è serverless. Astrae completamente la gestione dell'infrastruttura per consentirti di concentrarti su quello che conta davvero: creare applicazioni fantastiche.

L'obiettivo di questo tutorial è creare una semplice applicazione web ed eseguirne il deployment in Cloud Run.

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere utilizzato da remoto dal tuo laptop, in questo tutorial utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Attiva Cloud Shell

  1. Dalla console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Se è la prima volta che avvii Cloud Shell, ti verrà mostrata una schermata intermedia che descrive di cosa si tratta. Se ti è stata presentata una schermata intermedia, fai clic su Continua.

9c92662c6a846a5c.png

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

9f0e51b578fecce5.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.

Una volta stabilita la connessione a Cloud Shell, dovresti vedere che hai eseguito l'autenticazione e che il progetto è impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Esegui questo comando in Cloud Shell per confermare che il comando gcloud è a conoscenza del tuo progetto:
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Abilita le API

Da Cloud Shell, abilita le API Artifact Registry, Cloud Build e Cloud Run:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

Viene visualizzato un messaggio di operazione riuscita simile a questo:

Operation "operations/..." finished successfully.

Ora puoi iniziare a lavorare e scrivere la tua applicazione...

4. Scrivi l'applicazione

In questo passaggio, creerai un'applicazione Python basata su Flask semplice rispondendo alle richieste HTTP.

Directory di lavoro

Utilizza Cloud Shell per creare una directory di lavoro denominata helloworld-python e passa a questa directory:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

Crea un file denominato main.py:

touch main.py

Modifica il file con il tuo editor della riga di comando preferito (nano, vim o emacs) o facendo clic sul pulsante Editor di Cloud Shell:

10af7b1a6240e9f4.gif

Per modificare direttamente il file con l'editor di Cloud Shell, utilizza questo comando:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

Questo codice crea un servizio web di base che risponde alle richieste HTTP GET con un messaggio amichevole.

requirements.txt

Aggiungi un file denominato requirements.txt per definire le dipendenze:

touch requirements.txt

Per modificare direttamente il file con l'editor di Cloud Shell, utilizza questo comando:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

Infine, aggiungi un file denominato Procfile per specificare la modalità di pubblicazione dell'applicazione:

touch Procfile

Per modificare direttamente il file con l'editor di Cloud Shell, utilizza questo comando:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Assicurati che tutti i file siano presenti nella directory di lavoro:

ls

Dovrebbe essere visualizzato l'elenco dei file seguenti:

main.py  Procfile  requirements.txt

L'applicazione è pronta per il deployment, ma prima testiamo...

5. testa l'applicazione

Per testare l'applicazione, crea un ambiente virtuale:

virtualenv venv

Attiva l'ambiente virtuale:

source venv/bin/activate

Installa le dipendenze:

pip install -r requirements.txt

Dovresti ricevere un messaggio di conferma simile al seguente:

...
Successfully installed Flask ... gunicorn ...

Avvia la domanda di adesione:

python main.py

Dai log risulta che sei in modalità sviluppo:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

Nella finestra di Cloud Shell, fai clic sull'icona Web Preview e seleziona Preview on port 8080:

6c9ff9e5c692c58e.gif

Dovrebbe aprirsi una finestra del browser con il messaggio Hello World!.

Puoi anche aprire un'altra sessione di Cloud Shell (una nuova scheda del terminale) facendo clic sull'icona + e inviando una richiesta web all'applicazione in esecuzione in locale:

curl localhost:8080

Dovresti ricevere la seguente risposta:

Hello World!

Al termine, torna alla sessione principale di Cloud Shell e interrompi il comando python main.py con CTRL+C.

Esci dall'ambiente virtuale:

deactivate

Infine, rimuovi la directory dell'ambiente virtuale:

rm -r venv/

L'applicazione funziona come previsto: eseguiamo il deployment...

6. Esegui il deployment in Cloud Run

Cloud Run è regionale, il che significa che l'infrastruttura che esegue i tuoi servizi Cloud Run si trova in una regione specifica ed è gestita da Google per essere disponibile in modo ridondante in tutte le zone all'interno di quella regione. Definisci la regione che utilizzerai per il deployment, ad esempio:

REGION="europe-west9"

Assicurati di essere ancora nella directory di lavoro:

ls

Dovrebbe essere visualizzato l'elenco dei file seguenti:

main.py  Procfile  requirements.txt

Esegui il deployment dell'applicazione in Cloud Run:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • Puoi definire una regione predefinita con questo comando: gcloud config set run/region $REGION
  • Puoi anche rendere Cloud Run gestito per impostazione predefinita con questo comando: gcloud config set run/platform managed
  • L'opzione --allow-unauthenticated rende il servizio disponibile pubblicamente. Per evitare richieste non autenticate, utilizza invece --no-allow-unauthenticated.

La prima volta, ti verrà chiesto di creare un repository Artifact Registry. Tocca Invio per convalidare:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Verrà avviato il caricamento del codice sorgente nel repository Artifact Registry e la build dell'immagine container:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Quindi, attendi il completamento del deployment. Se l'operazione riesce, la riga di comando visualizza l'URL del servizio:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Puoi ottenere l'URL del servizio con questo comando:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

Il risultato dovrebbe essere simile al seguente:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

Ora puoi utilizzare la tua applicazione aprendo l'URL del servizio in un browser web:

c836b93e5601e2cf.gif

Puoi anche chiamare l'applicazione da Cloud Shell:

curl $SERVICE_URL?who=me

Dovrebbe essere visualizzato il messaggio di benvenuto previsto:

Hello me!

Complimenti! Hai appena eseguito il deployment di un'applicazione in Cloud Run. Cloud Run scala automaticamente e orizzontalmente l'immagine container per gestire le richieste ricevute, quindi fa lo scale down quando la domanda diminuisce. Paghi solo per la CPU, la memoria e il networking utilizzati durante la gestione delle richieste.

7. Esegui la pulizia

Sebbene Cloud Run non effettui addebiti quando il servizio non è in uso, potrebbe comunque esserti addebitato un costo per l'archiviazione dell'immagine container in Artifact Registry. Puoi eliminare il repository o il progetto Cloud per evitare addebiti. L'eliminazione del progetto Cloud interrompe la fatturazione per tutte le risorse utilizzate all'interno del progetto.

Per eliminare il repository di immagini container:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Per eliminare il tuo servizio Cloud Run:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

Per eliminare il tuo progetto Google Cloud:

  1. Recupera il tuo ID progetto attuale:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Assicurati che questo sia il progetto che vuoi eliminare:
echo $PROJECT_ID
  1. Elimina il progetto:
gcloud projects delete $PROJECT_ID

8. Complimenti!

96d07289bb51daa7.png

Hai creato una semplice applicazione web e ne hai eseguito il deployment in Cloud Run.

Scopri di più

Licenza

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