Le app Django in esecuzione su App Engine flessibile scalano in modo dinamico in base al traffico.
Questo tutorial presuppone che tu conosca lo sviluppo web di Django. Se non hai mai utilizzato lo sviluppo Django, ti consigliamo di scrivere la tua prima app Django prima di continuare.
Questo tutorial illustra in modo specifico Django, ma puoi utilizzare questo processo di deployment con altri framework basati su Django, come Wagtail e Django CMS.
Questo tutorial utilizza Django 3, che richiede almeno Python 3.7. L'ambiente flessibile di App Engine supporta Python 3.7.
Obiettivi
In questo tutorial, imparerai a:
- Crea e connetti un database Cloud SQL.
- Creare e utilizzare i valori segreti di Secret Manager.
Esegui il deployment di un'app Django in App Engine flessibile.
Ospitare file statici su Cloud Storage.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Se non l'hai ancora fatto, inizializza App Engine e seleziona la tua area geografica preferita:
gcloud app create
prepara l'ambiente
Clonare un'app di esempio
Il codice per l'app Django di esempio si trova nel repository GoogleCloudPlatform/python-docs-samples su GitHub.
Puoi scaricare l'esempio come file ZIP ed estrarlo oppure clonare il repository sulla tua macchina locale:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Vai alla directory che contiene il codice di esempio:
Linux/macOS
cd python-docs-samples/appengine/flexible/django_cloudsql
Windows
cd python-docs-samples\appengine\flexible\django_cloudsql
Conferma la configurazione Python
Questo tutorial si basa su Python per eseguire l'applicazione di esempio sulla tua macchina. Il codice campione richiede anche l'installazione di dipendenze
Per ulteriori dettagli, consulta la guida all'ambiente di sviluppo di Python.
Verifica che il tuo Python sia almeno la versione 3.7.
python -V
Dovresti vedere
Python 3.7.3
o un valore superiore.Crea un ambiente virtuale Python e installa le dipendenze:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv env venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
Scarica il proxy Cloud SQL Auth per connetterti a Cloud SQL dalla tua macchina locale
Una volta eseguito il deployment, l'applicazione utilizza il proxy Cloud SQL Auth integrato nell'ambiente flessibile di App Engine per comunicare con l'istanza Cloud SQL. Tuttavia, per testare la tua app localmente, devi installare e utilizzare una copia locale del proxy nel tuo ambiente di sviluppo. Per maggiori dettagli, consulta la guida al proxy Cloud SQL Auth.
Il proxy Cloud SQL Auth utilizza l'API Cloud SQL per interagire con la tua istanza SQL. A questo scopo, è necessaria l'autenticazione dell'applicazione tramite gcloud.
Autentica e acquisisci le credenziali per l'API:
gcloud auth application-default login
Scarica e installa il proxy Cloud SQL Auth sulla tua macchina locale.
Linux a 64 bit
- Scarica il proxy Cloud SQL Auth:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
- Rendi il eseguibile del proxy Cloud SQL Auth eseguibile:
chmod +x cloud_sql_proxy
Linux a 32 bit
- Scarica il proxy Cloud SQL Auth:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
- Se il comando
wget
non viene trovato, eseguisudo apt-get install wget
e ripeti il comando di download. - Rendi il eseguibile del proxy Cloud SQL Auth eseguibile:
chmod +x cloud_sql_proxy
macOS a 64 bit
- Scarica il proxy Cloud SQL Auth:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
- Rendi il eseguibile del proxy Cloud SQL Auth eseguibile:
chmod +x cloud_sql_proxy
macOS a 32 bit
- Scarica il proxy Cloud SQL Auth:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
- Rendi il eseguibile del proxy Cloud SQL Auth eseguibile:
chmod +x cloud_sql_proxy
Mac M1
- Scarica il proxy Cloud SQL Auth:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
- Rendi il eseguibile del proxy Cloud SQL Auth eseguibile:
chmod +x cloud_sql_proxy
Windows a 64 bit
Fai clic con il pulsante destro del mouse su https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe e seleziona Salva link con nome per scaricare il proxy Cloud SQL Auth. Rinomina il file comecloud_sql_proxy.exe
.Windows a 32 bit
Fai clic con il pulsante destro del mouse su https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe e seleziona Salva link con nome per scaricare il proxy Cloud SQL Auth. Rinomina il file comecloud_sql_proxy.exe
.Immagine Docker proxy Cloud SQL Auth
Per convenienza, diverse immagini container che contengono il proxy di autenticazione Cloud SQL sono disponibili su GitHub nel repository proxy di Cloud SQL Auth. Puoi estrarre l'immagine più recente sulla tua macchina locale utilizzando Docker con il seguente comando:docker pull gcr.io/cloudsql-docker/gce-proxy:1.30.1
Altro sistema operativo
Per altri sistemi operativi non inclusi, puoi compilare il proxy di autenticazione Cloud SQL dall'origine.Puoi scegliere di spostare il download in un punto comune, ad esempio una posizione in
PATH
o nella tua directory home. Se scegli di farlo, quando avvii il proxy di autenticazione Cloud SQL più avanti nel tutorial, ricorda di fare riferimento alla località scelta quando utilizzi i comandicloud_sql_proxy
.- Scarica il proxy Cloud SQL Auth:
Crea servizi di supporto
Questo tutorial utilizza diversi servizi Google Cloud per fornire il database, l'archiviazione multimediale e l'archiviazione segreta che supportano il progetto Django di cui è stato eseguito il deployment. Il deployment di questi servizi si svolge in un'area geografica specifica. Per ottimizzare l'efficienza tra i servizi, devi eseguire il deployment di tutti i servizi nella stessa area geografica. Per ulteriori informazioni sull'area geografica più vicina a te, consulta Prodotti disponibili per area geografica.
Configurare un'istanza Cloud SQL per PostgreSQL
Django supporta ufficialmente più database relazionali, ma offre il maggiore supporto per PostgreSQL. PostgreSQL è supportato da Cloud SQL, quindi questo tutorial sceglie di utilizzare questo tipo di database.
La sezione seguente descrive la creazione di un'istanza, un database e un utente di database PostgreSQL per l'app.
Crea l'istanza PostgreSQL:
Console
In Cloud Console, vai alla pagina Istanze Cloud SQL.
Fai clic su Crea istanza.
Fai clic su PostgreSQL.
Nel campo ID istanza, inserisci
INSTANCE_NAME
.Inserisci una password per l'utente postgres.
Mantieni i valori predefiniti per gli altri campi.
Fai clic su Crea.
Sono necessari alcuni minuti per creare l'istanza e prima che sia pronta per l'utilizzo.
gcloud
Crea l'istanza PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
Sostituisci quanto segue:
INSTANCE_NAME
: nome dell'istanza Cloud SQLPROJECT_ID
: l'ID progetto di Google CloudREGION
: l'area geografica Google Cloud
Sono necessari alcuni minuti per creare l'istanza e prima che sia pronta per l'utilizzo.
All'interno dell'istanza creata, crea un database:
Console
- Nella pagina dell'istanza, vai alla scheda Database.
- Fai clic su Crea database.
- Nella finestra di dialogo Nome database, inserisci
DATABASE_NAME
. - Fai clic su Crea.
gcloud
Crea il database all'interno dell'istanza creata di recente:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
Sostituisci
DATABASE_NAME
con un nome per il database all'interno dell'istanza.
Crea un utente del database:
Console
- Nella pagina dell'istanza, vai alla scheda Utenti.
- Fai clic su Add User Account (Aggiungi account utente).
- Nella finestra di dialogo Aggiungi un account utente all'istanza in "Autenticazione integrata":
- Inserisci il nome utente
DATABASE_USERNAME
. - Inserisci la password
DATABASE_PASSWORD
- Fai clic su Aggiungi.
gcloud
Crea l'utente all'interno dell'istanza creata di recente:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
Sostituisci
PASSWORD
con una password sicura.
Configurare un bucket Cloud Storage
Puoi archiviare risorse statiche incluse di Django e i contenuti multimediali caricati dagli utenti nella memoria di oggetti ad alta disponibilità utilizzando Cloud Storage.
Il pacchetto django-storages[google]
gestisce l'interazione di Django con questo backend di archiviazione.
Console
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
- For Location, select the following: MEDIA_BUCKET
- For Choose a default storage class for your data, select the following: Standard.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
gcloud
Lo strumento a riga di comando gsutil
è stato installato durante l'installazione dell'interfaccia a riga di comando gcloud.
Crea un bucket Cloud Storage:
gsutil mb -l REGION gs://PROJECT_ID_MEDIA_BUCKET
Sostituisci
MEDIA_BUCKET
con un suffisso per il bucket multimediale. In combinazione con l'ID progetto, crea un nome univoco per il bucket.
Archivia valori di secret in Secret Manager
Ora che i servizi di supporto sono configurati, Django ha bisogno di informazioni su questi servizi. Anziché inserire questi valori direttamente nel codice sorgente di Django, questo tutorial utilizza Secret Manager per archiviare queste informazioni in modo sicuro.
L'ambiente flessibile di App Engine interagisce con i secret mediante il suo account di servizio.Crea file di ambiente Django come secret di Secret Manager
Archivia le impostazioni necessarie per avviare Django in un file env protetto.
L'app di esempio utilizza l'API Secret Manager per recuperare il valore
secret e il pacchetto django-environ
per caricare i valori nell'ambiente Django. Il secret è configurato per essere accessibile da App Engine flessibile.
Crea un file denominato
.env
, definendo la stringa di connessione al database, il nome del bucket multimediale e un nuovo valoreSECRET_KEY
:echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .env
Archivia il secret in Secret Manager:
Console
In Cloud Console, vai alla pagina di Secret Manager.
Fai clic su Crea secret.
Nel campo Nome, inserisci
django_settings
.Nella finestra di dialogo Valore segreto, incolla il contenuto del file
.env
.Fai clic su Crea secret.
Elimina il file locale per evitare sostituzioni di impostazioni locali.
gcloud
Crea un nuovo secret,
django_settings
, con il valore del file.env
:gcloud secrets create django_settings --data-file .env
Per confermare la creazione del secret, controlla:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
Elimina il file locale per evitare sostituzioni delle impostazioni locali:
rm .env
Configura l'accesso al secret:
Console
- Fai clic sulla scheda Autorizzazioni.
- Fai clic su Aggiungi.
- Nel campo Nuovi membri, inserisci
PROJECT_ID@appspot.gserviceaccount.com
, quindi premiEnter
. - Nel menu a discesa Ruolo, seleziona Accesso segreto Secret Manager.
- Fai clic su Salva.
gcloud
Concedi l'accesso al secret all'account di servizio flessibile di App Engine:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Esecuzione dell'applicazione nel computer locale
Dopo aver configurato i servizi di supporto, ora puoi eseguire l'app sul tuo computer. Questa configurazione consente lo sviluppo locale, la creazione di un super user e l'applicazione di migrazioni dei database.
In un terminale separato, avvia il proxy di autenticazione Cloud SQL:
Linux/macOS
./cloud_sql_proxy -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
Windows
cloud_sql_proxy.exe -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
Questo passaggio stabilisce una connessione dal computer locale alla tua istanza Cloud SQL a scopo di test locale. Mantieni il proxy Cloud SQL Auth in esecuzione per tutto il tempo per testare l'app localmente. L'esecuzione di questo processo in un terminale separato ti consente di continuare a lavorare durante l'esecuzione del processo.
In un nuovo terminale, imposta l'ID progetto localmente (utilizzato dall'API Secret Manager):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Imposta una variabile di ambiente per indicare che utilizzi il proxy Cloud SQL Auth (questo valore è riconosciuto nel codice):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
set USE_CLOUD_SQL_AUTH_PROXY=true
Esegui le migrazioni Django per configurare i modelli e gli asset:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Avvia il server web di Django:
python manage.py runserver
Nel browser, vai alla pagina http://localhost:8000.
Nella pagina viene visualizzato il seguente testo: "Hello world. Sei nell'indice dei sondaggi." Il server web di Django in esecuzione sul computer fornisce le pagine di esempio dell'app.
Premi
Ctrl
/Cmd
+C
per arrestare il server web locale.
Utilizzare la Console di amministrazione Django
Per accedere alla Console di amministrazione di Django devi creare un super user. Poiché hai una connessione accessibile in locale al database, puoi eseguire comandi di gestione:
Crea un super user. Ti verrà chiesto di inserire nome utente, indirizzo email e password.
python manage.py createsuperuser
Avvia un server web locale:
python manage.py runserver
Nel browser, vai alla pagina http://localhost:8000/admin.
Accedi al sito di amministrazione utilizzando il nome utente e la password che hai utilizzato quando hai eseguito
createsuperuser
.
Eseguire il deployment dell'app nell'ambiente flessibile di App Engine
Con tutti i servizi di supporto configurati e l'applicazione testata in locale, puoi eseguire il deployment dell'app in App Engine flessibile:
- Apri
app.yaml
e aggiorna il valorecloud_sql_instances
con la stringa di istanza Cloud SQL:... beta_settings: cloud_sql_instances: PROJECT_ID:REGION:INSTANCE_NAME
- Carica l'app eseguendo questo comando, che esegue il deployment dell'app come descritto in
app.yaml
e imposta la versione di cui hai appena eseguito il deployment come versione predefinita, consentendo di gestire tutto il nuovo traffico:gcloud app deploy
- Conferma le impostazioni digitando "yes" (sì) quando richiesto.
- Attendi il messaggio che ti comunica che l'aggiornamento è stato completato.
Esecuzione dell'app di cui hai eseguito il deployment
Il deployment dell'app è stato eseguito e ora puoi accedervi:
Apri il sito web di cui hai eseguito il deployment:
gcloud app browse
In alternativa, visualizza l'URL e aprilo manualmente:
gcloud app describe --format "value(defaultHostname)"
La tua richiesta viene gestita da un server web in esecuzione nell'ambiente flessibile di App Engine.
Aggiornamento dell'applicazione
Per aggiornare la tua applicazione, apporta modifiche al codice, quindi esegui di nuovo il comando gcloud app deploy
.
Il deployment crea una nuova versione dell'app e la promuove alla versione predefinita. Vengono mantenute le versioni precedenti dell'app e le istanze della macchina virtuale (VM) associate. Tutte queste versioni di app e istanze VM sono risorse fatturabili. Per ridurre i costi, elimina le versioni non predefinite dell'app.
Configurazione per la produzione in corso...
Ora hai un deployment Django funzionante, ma ci sono ulteriori passaggi che puoi seguire per assicurarti che la tua applicazione sia pronta per la produzione.
Disattiva debug
Verifica che la variabile DEBUG
in mysite/settings.py
sia impostata su False
. In questo modo, non sarà possibile mostrare all'utente pagine di errore dettagliate contenenti informazioni sulle configurazioni.
Limita i privilegi utente del database
Tutti gli utenti creati tramite Cloud SQL hanno i privilegi associati al
ruolo cloudsqlsuperuser
:
CREATEROLE
, CREATEDB
e LOGIN
.
Per impedire che l'utente del database Django abbia queste autorizzazioni, crea manualmente l'utente in PostgreSQL. Dovrai avere installato il terminale interattivo di psql
oppure utilizzare Cloud Shell su cui è preinstallato questo strumento.
Console
-
In the Google Cloud console, activate Cloud Shell.
In Cloud Shell, utilizza il terminale integrato per connetterti all'istanza
INSTANCE_NAME
:gcloud sql connect INSTANCE_NAME --user postgres
Inserisci la password utente postgres.
Ora stai utilizzando
psql
. Dovresti vedere il messaggiopostgres=>
.Creare un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Sostituisci
PASSWORD
con una password univoca e casuale.Concedi tutti i diritti sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Esci da:
psql
\q
gcloud
Avvia una connessione all'istanza SQL:
gcloud sql connect INSTANCE_NAME --user postgres
Sostituisci
INSTANCE_NAME
con l'istanza Cloud SQL creata.Inserisci la password utente postgres.
Ora stai utilizzando
psql
. Dovresti vedere il messaggiopostgres=>
.Creare un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Concedi tutti i diritti sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Esci da:
psql
\q
Comprendere il codice
Applicazione di esempio
L'app di esempio Django è stata creata usando gli strumenti standard Django. I seguenti comandi creano il progetto e l'app Sondaggi:
django-admin startproject mysite
python manage.py startapp polls
Le visualizzazioni di base, i modelli e le configurazioni dei percorsi sono stati copiati da Scrittura della prima app Django (Parte 1 e Parte 2).
Secret di Secret Manager
Il file settings.py
contiene il codice che utilizza l'API Secret Manager Python per recuperare l'ultima versione del secret denominato e eseguirne il pull nell'ambiente (utilizzando django-environ
):
Il secret viene utilizzato per archiviare più valori del secret per ridurre il numero di diversi secret da configurare.
Sostituzioni secret locali
Se nel file system locale viene trovato un file .env
, viene utilizzato al posto del valore di Secret Manager. La creazione di un file .env
a livello locale può essere utile per i test locali (ad es., sviluppo locale rispetto a un database SQLite o altre impostazioni locali).
Connessione al database
Il file settings.py
contiene la configurazione per il database SQL. Se configuri
USE_CLOUD_SQL_AUTH_PROXY
, l'impostazione DATABASES
viene modificata per dedurre
l'uso del proxy di autenticazione Cloud SQL.
Statico archiviato su cloud
Il file settings.py
utilizza inoltre django-storages
per integrare il bucket multimediale di Cloud Storage direttamente nel progetto:
App Engine app.yaml
Il file app.yaml
contiene le informazioni di configurazione per il deployment nell'ambiente flessibile:
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Scopri come configurare PostgreSQL per la produzione
- Scopri di più su Django su Google Cloud