Le app Django in esecuzione nell'ambiente standard di App Engine vengono scalate in modo dinamico in base al traffico.
Questo tutorial presuppone che tu abbia familiarità con lo sviluppo web Django. Se non hai mai sviluppato con Django, ti consigliamo di seguire la procedura per scrivere la tua prima app Django prima di continuare.
Sebbene questo tutorial mostri Django in modo specifico, puoi utilizzare questa procedura di deployment con altri framework basati su Django, come Wagtail e Django CMS.
Questo tutorial utilizza Django 4, che richiede almeno Python 3.8. L'ambiente standard di App Engine supporta Python 3.7 e versioni successive, inclusa Python 3.8.
Obiettivi
In questo tutorial, imparerai a:
- Crea e connetti un database Cloud SQL.
- Crea e utilizza i valori dei secret di Secret Manager.
- Esegui il deployment di un'app Django nell'ambiente standard di App Engine.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Prima di iniziare
- Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init - Se non l'hai ancora fatto, inizializza App Engine e seleziona la tua regione preferita:
gcloud app create
prepara l'ambiente
Clona un'app di esempio
Il codice dell'app di esempio Django si trova nel repository GoogleCloudPlatform/python-docs-samples su GitHub.
Puoi scaricare l'esempio come file ZIP ed estrarlo o clonare il repository sulla tua macchina locale:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitVai alla directory che contiene il codice di esempio:
Linux/macOS
cd python-docs-samples/appengine/standard_python3/djangoWindows
cd python-docs-samples\appengine\standard_python3\django
Conferma la configurazione di Python
Questo tutorial si basa su Python per eseguire l'applicazione di esempio sulla tua macchina. Il codice campione richiede anche l'installazione delle dipendenze
Per maggiori dettagli, consulta la guida all'ambiente di sviluppo Python.
Verifica che Python sia almeno alla versione 3.8.
python -VDovresti visualizzare
Python 3.8.0o 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.txtWindows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
Scarica il proxy di autenticazione Cloud SQL per connetterti a Cloud SQL dalla tua macchina locale
Una volta eseguito il deployment, l'app utilizza il proxy di autenticazione Cloud SQL integrato nell'ambiente standard di App Engine per comunicare con l'istanza Cloud SQL. Tuttavia, per testare l'app localmente, devi installare e utilizzare una copia locale del proxy nel tuo ambiente di sviluppo. Per ulteriori dettagli, consulta la guida al proxy di autenticazione Cloud SQL.
Il proxy di autenticazione Cloud SQL utilizza l'API Cloud SQL per interagire con l'istanza SQL. Per farlo, è necessaria l'autenticazione dell'applicazione tramite gcloud CLI.
Autenticati e acquisisci le credenziali per l'API:
gcloud auth application-default loginScarica e installa il proxy di autenticazione Cloud SQL sulla tua macchina locale.
Linux a 64 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Linux a 32 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
- Se il comando
curlnon viene trovato, eseguisudo apt install curle ripeti il comando di download. - Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
macOS a 64 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Mac M1
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Windows a 64 bit
Fai clic con il tasto destro del mouse su https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x64.exe e seleziona Salva link con nome per scaricare il proxy di autenticazione Cloud SQL. Rinomina il file incloud-sql-proxy.exe.Windows a 32 bit
Fai clic con il tasto destro del mouse su https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x86.exe e seleziona Salva link con nome per scaricare il proxy di autenticazione Cloud SQL. Rinomina il file incloud-sql-proxy.exe.Immagine Docker del proxy di autenticazione Cloud SQL
Il proxy di autenticazione Cloud SQL ha immagini container diverse, ad esempio
distroless,alpineebuster. L'immagine del container del proxy di autenticazione Cloud SQL predefinita utilizzadistroless, che non contiene alcuna shell. Se hai bisogno di una shell o di strumenti correlati, scarica un'immagine basata sualpineobuster. Per maggiori informazioni, vedi Immagini container del proxy di autenticazione Cloud SQL.Puoi eseguire il pull dell'ultima immagine sulla tua macchina locale utilizzando Docker con il seguente comando:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.1
Altri sistemi operativi
Per altri sistemi operativi non inclusi qui, puoi compilare il proxy di autenticazione Cloud SQL dal codice sorgente.Puoi scegliere di spostare il download in una posizione comune, ad esempio una posizione sul tuo
PATHo nella tua home directory. Se scegli di farlo, quando avvii il proxy di autenticazione Cloud SQL più avanti nel tutorial, ricordati di fare riferimento alla località scelta quando utilizzi i comandicloud-sql-proxy.- Scarica il proxy di autenticazione Cloud SQL:
Crea servizi di backend
Questo tutorial utilizza diversi servizi Google Cloud per fornire il database, l'archiviazione dei contenuti multimediali e l'archiviazione dei secret che supportano il progetto Django di cui è stato eseguito il deployment. Questi servizi vengono implementati in una regione specifica. Per l'efficienza tra i servizi, tutti i servizi devono essere implementati nella stessa regione. Per saperne di più sulla regione più vicina a te, consulta Prodotti disponibili per regione.
Questo tutorial utilizza i meccanismi di hosting di asset statici integrati in App Engine standard.Configura un'istanza Cloud SQL per PostgreSQL
Django supporta ufficialmente più database relazionali, ma offre il massimo 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 PostgreSQL, di un database e di un utente del database per l'app.
Crea l'istanza PostgreSQL:
Console
Nella console Google Cloud , vai alla pagina Istanze Cloud SQL.
Fai clic su Crea istanza.
Fai clic su Scegli PostgreSQL.
Per Versione SQL, scegli "Enterprise".
Per Preset versione, scegli "Sandbox".
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 istanza.
L'istanza sarà pronta per l'uso dopo qualche minuto.
gcloud
Crea l'istanza PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
Sostituisci quanto segue:
INSTANCE_NAME: il nome dell'istanza Cloud SQLPROJECT_ID: l' Google Cloud ID progettoREGION: la Google Cloud regione
La creazione dell'istanza e la sua preparazione all'uso richiedono alcuni minuti.
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 appena creata:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMESostituisci
DATABASE_NAMEcon 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 Aggiungi account utente.
- Nella finestra di dialogo Scegli la modalità di autenticazione nella sezione "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 appena creata:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORDSostituisci
PASSWORDcon una password sicura.
Archivia i valori dei secret in Secret Manager
Ora che i servizi di backend sono configurati, Django ha bisogno di informazioni su questi servizi. Anziché inserire questi valori direttamente nel codice sorgente Django, questo tutorial utilizza Secret Manager per archiviare queste informazioni in modo sicuro.
Crea il file di ambiente Django come secret di Secret Manager
Memorizzi le impostazioni necessarie per avviare Django in un file ENV protetto.
L'app di esempio utilizza l'API Secret Manager per recuperare il valore del secret e il pacchetto django-environ per caricare i valori nell'ambiente Django. Il secret è configurato
in modo che sia accessibile da App Engine standard.
Crea un file denominato
.env, definendo la stringa di connessione al database, il nome del bucket dei contenuti multimediali 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) >> .envArchivia il secret in Secret Manager:
Console
Nella console Google Cloud , vai alla pagina Secret Manager.
Fai clic su Crea secret.
Nel campo Nome, inserisci
django_settings.Nella finestra di dialogo Valore secret, incolla i contenuti del file
.env.Fai clic su Crea secret.
Elimina il file locale per evitare override delle impostazioni locali.
gcloud
Crea un nuovo secret,
django_settings, con il valore del file.env:gcloud secrets create django_settings --data-file .envElimina il file locale per evitare override delle impostazioni locali:
rm .env
Configura l'accesso al secret:
Console
Fai clic sulla scheda Autorizzazioni.
Fai clic su Concedi l'accesso.
Nel campo Nuovi membri, inserisci
PROJECT_ID@appspot.gserviceaccount.come poi premiEnter.Nel menu a discesa Ruolo, seleziona Secret Manager Secret Accessor.
Fai clic su Salva.
gcloud
Concedi l'accesso al secret al account di servizio standard di App Engine:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Nell'output, verifica che bindings elenchi il nuovo account di servizio.
Esecuzione dell'applicazione nel computer locale
Con i servizi di backend configurati, ora puoi eseguire l'app sul tuo computer. Questa configurazione consente lo sviluppo locale, la creazione di un superutente e l'applicazione delle migrazioni del database.
In un terminale separato, avvia il proxy di autenticazione Cloud SQL:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAMEQuesto passaggio stabilisce una connessione dal computer locale all'istanza Cloud SQL a scopo di test locale. Mantieni in esecuzione il proxy di autenticazione Cloud SQL per tutto il tempo in cui testi l'app in locale. L'esecuzione di questo processo in un terminale separato ti consente di continuare a lavorare mentre il processo è in esecuzione.
Nel terminale originale, imposta l'ID progetto localmente (utilizzato dall'API Secret Manager):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_IDWindows
set GOOGLE_CLOUD_PROJECT=PROJECT_IDImposta una variabile di ambiente per indicare che stai utilizzando il proxy di autenticazione Cloud SQL (questo valore è riconosciuto nel codice):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=trueWindows
set USE_CLOUD_SQL_AUTH_PROXY=trueEsegui 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 collectstaticAvvia il server web Django:
python manage.py runserver 8080Nel browser, vai alla pagina http://localhost:8080.
Se ti trovi in Cloud Shell, fai clic sul pulsante Anteprima web e seleziona Anteprima sulla porta 8080.
Nella pagina viene visualizzato il seguente testo: "Hello, world. Ti trovi nell'indice dei sondaggi". Il server web Django in esecuzione sul tuo computer fornisce le pagine dell'app di esempio.
Premi
Ctrl/Cmd+Cper arrestare il server web locale.
Utilizzare la console di amministrazione di Django
Per accedere alla console di amministrazione di Django, devi creare un superutente. Poiché hai una connessione al database accessibile localmente, puoi eseguire i comandi di gestione:
Crea un superuser. Ti verrà chiesto di inserire un nome utente, un indirizzo email e una password.
python manage.py createsuperuserAvvia un server web locale:
python manage.py runserverNel browser, vai all'indirizzo http://localhost:8000/admin.
Accedi al sito di amministrazione utilizzando il nome utente e la password che hai utilizzato quando hai eseguito
createsuperuser.
Esegui il deployment dell'app nell'ambiente standard di App Engine
Ora che tutti i servizi di backend sono configurati e l'applicazione è stata testata localmente, puoi eseguirne il deployment in App Engine standard:
- Carica l'app eseguendo il seguente comando, che esegue il deployment dell'app come descritto in
app.yamle imposta la versione di cui è stato appena eseguito il deployment come versione predefinita, in modo che gestisca tutto il nuovo traffico:gcloud app deploy - Conferma le impostazioni digitando "yes" quando richiesto.
- Attendi il messaggio che ti informa che l'aggiornamento è stato completato.
- Apri
app.yamle aggiorna il valore diAPPENGINE_URLcon l'URL di cui è stato eseguito il deployment:... env_variables: APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com - Carica le modifiche alla configurazione:
gcloud app deploy
Esecuzione dell'app di cui è stato eseguito il deployment
L'app è stata implementata e ora è accessibile:
Apri il sito web di cui è stato eseguito il deployment:
gcloud app browseIn alternativa, visualizza l'URL e aprilo manualmente:
gcloud app describe --format "value(defaultHostname)"
La tua richiesta viene gestita da un web server in esecuzione nell'ambiente standard di App Engine.
Aggiornamento dell'applicazione
Per aggiornare l'applicazione, apporta modifiche al codice, quindi esegui di nuovo il comando gcloud app deploy.
Il deployment crea una nuova versione della tua app e la promuove alla versione predefinita. Le versioni precedenti della tua app rimangono. Tutte queste versioni dell'app sono risorse fatturabili. Per ridurre i costi, elimina le versioni non predefinite della tua app.
Configurazione per la produzione
Ora hai un deployment Django funzionante, ma puoi eseguire ulteriori passaggi per assicurarti che la tua applicazione sia pronta per la produzione.
Disattivare il debug
Verifica che la variabile DEBUG in mysite/settings.py sia impostata su False. In questo modo
si impedisce la visualizzazione di pagine di errore dettagliate all'utente, il che può rivelare informazioni sulle configurazioni.
Limita i privilegi dell'utente del database
Gli utenti creati utilizzando Cloud SQL dispongono dei privilegi associati al
ruolo cloudsqlsuperuser:
CREATEROLE, CREATEDB e LOGIN.
Per impedire all'utente del database Django di disporre di queste autorizzazioni, crea manualmente l'utente in PostgreSQL. Devi aver installato il terminale interattivo psql o utilizzare Cloud Shell, in cui questo strumento è preinstallato.
Console
-
Nella console Google Cloud , attiva Cloud Shell.
In Cloud Shell, utilizza il terminale integrato per connetterti all'istanza
INSTANCE_NAME:gcloud sql connect INSTANCE_NAME --user postgresInserisci la password dell'utente postgres.
Ora stai utilizzando
psql. Dovresti visualizzare il promptpostgres=>.Crea un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';Sostituisci
PASSWORDcon una password univoca e casuale.Concedi diritti completi sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;Uscita
psql:\q
gcloud
Avvia una connessione all'istanza SQL:
gcloud sql connect INSTANCE_NAME --user postgresSostituisci
INSTANCE_NAMEcon l'istanza Cloud SQL creata.Inserisci la password dell'utente postgres.
Ora stai utilizzando
psql. Dovresti visualizzare il promptpostgres=>.Crea un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';Concedi diritti completi sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;Uscita
psql:\q
comprendi il codice
Applicazione di esempio
L'app di esempio Django è stata creata utilizzando gli strumenti Django standard. I seguenti comandi creano il progetto e l'app Sondaggi:
django-admin startproject mysite
python manage.py startapp polls
Le visualizzazioni, i modelli e le configurazioni di route di base sono stati copiati da Scrivere la prima app Django (Parte 1 e Parte 2).
Secret di Secret Manager
Il file settings.py contiene codice che utilizza l'API Python di Secret Manager per recuperare l'ultima versione del secret denominato e inserirla nell'ambiente (utilizzando django-environ):
Il secret viene utilizzato per archiviare più valori secret per ridurre il numero di secret diversi da configurare.
Configurazioni CSRF
Django offre una protezione integrata contro gli attacchi Cross-Site Request Forgery (CSRF). A partire da Django 4.0, le modifiche al funzionamento di questa funzionalità fanno sì che sia importante comunicare a Django l'URL di hosting, in modo che possa offrire la migliore protezione per gli utenti che inviano dati.
Fornisci l'URL dell'app come variabile di ambiente nel file settings.py. Questo è il valore utilizzato da Django per le impostazioni pertinenti.
Override dei secret locali
Se viene trovato un file .env sul file system locale, viene utilizzato al posto del valore di Secret Manager. La creazione di un file .env in 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 del database SQL. Utilizza l'helper env.db()
di django-environ per caricare la stringa di connessione impostata in DATABASE_URL nell'impostazione DATABASES.
Quando esegui l'applicazione localmente e utilizzi il proxy di autenticazione Cloud SQL per accedere al database ospitato, il flag USE_CLOUD_SQL_AUTH_PROXY regola le impostazioni del database per utilizzare il proxy.
Contenuti statici ospitati
Il file app.yaml
contiene le informazioni di configurazione per il deployment in App Engine.
Questo file app.yaml specifica che App Engine pubblica i file statici
dalla directory static/:
Quando esegui l'app localmente con DEBUG abilitato, questi file vengono pubblicati localmente da Django:
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
- Nella console Google Cloud , vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Scopri come configurare PostgreSQL per la produzione
- Scopri di più su Django su Google Cloud