Die Bereitstellung von zustandsorientierten Anwendungen wie Django in Cloud Run umfasst das Einbinden von Diensten, die miteinander interagieren, um ein zusammenhängendes Projekt zu bilden.
In dieser Anleitung wird davon ausgegangen, dass Sie mit der Django-Webentwicklung vertraut sind. Wenn Sie mit der Django-Entwicklung noch nicht vertraut sind, sollten Sie zuerst Ihre erste Django-Anwendung schreiben.
In dieser Anleitung wird insbesondere Django beschrieben. Sie können diesen Bereitstellungsprozess auch mit anderen Django-basierten Frameworks wie Wagtail und Django CMS verwenden.
In dieser Anleitung wird JWT 4 verwendet, für das mindestens Python 3.8 erforderlich ist.
Lernziele
In dieser Anleitung wird Folgendes beschrieben:
- Cloud SQL-Datenbank erstellen und verbinden
- Secret-Werte von Secret Manager erstellen und verwenden
Django-Anwendung für Cloud Run bereitstellen
Statische Dateien in Cloud Storage hosten
Bereitstellung mit Cloud Build automatisieren
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Hinweis
- 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.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine 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.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Achten Sie darauf, dass das für diese Anleitung verwendete Konto über ausreichende Berechtigungen verfügt.
Umgebung vorbereiten
Beispielanwendung klonen
Den Code für die Django-Beispielanwendung finden Sie im Repository GoogleCloudPlatform/python-docs-samples auf GitHub.
Sie können entweder das Beispiel als ZIP-Datei herunterladen und entpacken oder das Repository auf Ihren lokalen Computer klonen:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Gehen Sie zum Verzeichnis mit dem Beispielcode:
Linux/macOS
cd python-docs-samples/run/django
Windows
cd python-docs-samples\run\django
Python-Einrichtung bestätigen
Diese Anleitung setzt auf Python, um die Beispielanwendung auf Ihrem Computer auszuführen. Der Beispielcode erfordert auch die Installation von Abhängigkeiten.
Weitere Informationen finden Sie im Leitfaden zur Python-Entwicklungsumgebung.
Prüfen Sie, ob Python mindestens Version 3.7 hat.
python -V
Sie sollten
Python 3.7.3
oder höher haben.Erstellen Sie eine virtuelle Python-Umgebung und installieren Sie Abhängigkeiten:
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
Cloud SQL-Auth-Proxy herunterladen, um von Ihrem lokalen Computer aus eine Verbindung zu Cloud SQL herzustellen
Nach der Bereitstellung verwendet die Anwendung den in die Cloud Run-Umgebung integrierten Cloud SQL Auth-Proxy, um mit der Cloud SQL-Instanz zu kommunizieren. Sie müssen jedoch eine lokale Kopie des Cloud SQL Proxys in Ihrer Entwicklungsumgebung installieren und verwenden, um die Anwendung lokal zu testen. Weitere Informationen finden Sie im Leitfaden für den Cloud SQL Auth-Proxy.
Der Cloud SQL Auth-Proxy verwendet die Cloud SQL API, um mit Ihrer SQL-Instanz zu interagieren. Dazu ist eine Authentifizierung der Anwendung über gcloud erforderlich.
Authentifizieren und rufen Sie Anmeldedaten für die API ab:
gcloud auth application-default login
Laden Sie den Cloud SQL Auth-Proxy herunter und installieren Sie ihn auf Ihrem lokalen Computer.
Linux 64-Bit
- Laden Sie den Cloud SQL Auth-Proxy herunter:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
- Machen Sie den Cloud SQL Auth-Proxy ausführbar:
chmod +x cloud_sql_proxy
Linux 32-Bit
- Laden Sie den Cloud SQL Auth-Proxy herunter:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
- Wenn der Befehl
wget
nicht gefunden wird, führen Siesudo apt-get install wget
aus und wiederholen Sie den Downloadbefehl. - Machen Sie den Cloud SQL Auth-Proxy ausführbar:
chmod +x cloud_sql_proxy
macOS 64-Bit
- Laden Sie den Cloud SQL Auth-Proxy herunter:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
- Machen Sie den Cloud SQL Auth-Proxy ausführbar:
chmod +x cloud_sql_proxy
macOS 32-Bit
- Laden Sie den Cloud SQL Auth-Proxy herunter:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
- Machen Sie den Cloud SQL Auth-Proxy ausführbar:
chmod +x cloud_sql_proxy
Mac M1
- Laden Sie den Cloud SQL Auth-Proxy herunter:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
- Machen Sie den Cloud SQL Auth-Proxy ausführbar:
chmod +x cloud_sql_proxy
Windows 64-Bit
Klicken Sie mit der rechten Maustaste auf https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe, wählen Sie Link speichern unter aus und laden Sie den Cloud SQL Auth-Proxy herunter. Benennen Sie die Datei incloud_sql_proxy.exe
um.Windows 32-Bit
Klicken Sie mit der rechten Maustaste auf https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe, wählen Sie Link speichern unter aus und laden Sie den Cloud SQL Auth-Proxy herunter. Benennen Sie die Datei incloud_sql_proxy.exe
um.Docker-Image des Cloud SQL Auth-Proxys
Der Einfachheit halber sind mehrere Container-Images, die den Cloud SQL Auth-Proxy enthalten, auf GitHub im Cloud SQL Auth-Proxy-Repository verfügbar. Mit folgendem Befehl können Sie das neueste Image mithilfe von Docker auf Ihren lokalen Computer übertragen:docker pull gcr.io/cloudsql-docker/gce-proxy:1.30.1
Andere Betriebssysteme
Für andere Betriebssysteme, die hier nicht aufgeführt sind, können Sie den Cloud SQL Auth-Proxy aus der Quelle kompilieren.Sie können den Download an einen gemeinsam genutzten Speicherort verschieben, z. B. in einen Speicherort in Ihrem
PATH
oder in Ihr Basisverzeichnis. Wenn Sie das tun, müssen Sie beim Starten des Cloud SQL Auth-Proxys später in der Anleitung bei der Verwendung voncloud_sql_proxy
-Befehlen auf den ausgewählten Standort verweisen.- Laden Sie den Cloud SQL Auth-Proxy herunter:
Sicherungsdienste erstellen
In dieser Anleitung werden verschiedene Google Cloud-Dienste verwendet, um die Datenbank, den Medienspeicher und den Secret-Speicher bereitzustellen, die das bereitgestellte Django-Projekt unterstützen. Diese Dienste werden in einer bestimmten Region bereitgestellt. Zur Steigerung der Effizienz zwischen den Diensten sollten alle Dienste in derselben Region bereitgestellt werden. Weitere Informationen zur nächstgelegenen Region finden Sie unter Produktverfügbarkeit nach Region.
In dieser Anleitung werden die integrierten Hostingmechanismen für statische Assets in Cloud Run verwendet.Cloud SQL for PostgreSQL-Instanz einrichten
Django unterstützt offiziell mehrere relationale Datenbanken, bietet aber für PostgreSQL die beste Unterstützung. PostgreSQL wird von Cloud SQL unterstützt. In dieser Anleitung wird daher dieser Datenbanktyp verwendet.
Im folgenden Abschnitt wird das Erstellen einer PostgreSQL-Instanz, einer Datenbank und eines Datenbanknutzers für die Anwendung beschrieben.
Erstellen Sie die PostgreSQL-Instanz:
Console
Rufen Sie in der Cloud Console die Seite Cloud SQL-Instanzen auf.
Klicken Sie auf Instanz erstellen.
Klicken Sie auf PostgreSQL.
Geben Sie im Feld Instanz-ID den Wert
INSTANCE_NAME
ein.Geben Sie das Passwort für den Postgres-Nutzer ein.
Übernehmen Sie für die anderen Felder die Standardwerte.
Klicken Sie auf Erstellen.
Es dauert einige Minuten, bis die Instanz erstellt und einsatzbereit ist.
gcloud
Erstellen Sie die PostgreSQL-Instanz:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
Ersetzen Sie Folgendes:
INSTANCE_NAME
: der Name der Cloud SQL-InstanzPROJECT_ID
: die Google Cloud-Projekt-IDREGION
: die Google Cloud-Region
Es dauert einige Minuten, bis die Instanz erstellt und einsatzbereit ist.
Erstellen Sie in der erstellten Instanz eine Datenbank:
Console
- Wechseln Sie auf der Instanzseite zum Tab Datenbanken.
- Klicken Sie auf Datenbank erstellen.
- Geben Sie im Dialogfeld Datenbankname
DATABASE_NAME
ein. - Klicken Sie auf Erstellen.
gcloud
Erstellen Sie die Datenbank in der kürzlich erstellten Instanz:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
Ersetzen Sie
DATABASE_NAME
durch einen Namen für die Datenbank in der Instanz.
Erstellen Sie einen Datenbanknutzer:
Console
- Wechseln Sie auf der Instanzseite zum Tab Nutzer.
- Klicken Sie auf Nutzerkonto hinzufügen.
- Im Dialogfeld Nutzerkonto zur Instanz hinzufügen unter „Integrierte Authentifizierung”:
- Geben Sie den Nutzernamen
DATABASE_USERNAME
ein. - Geben Sie das Passwort
DATABASE_PASSWORD
ein. - Klicken Sie auf Add.
gcloud
Erstellen Sie den Nutzer in der kürzlich erstellten Instanz:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
Ersetzen Sie
PASSWORD
durch ein sicheres Passwort.
Cloud Storage-Bucket einrichten
Sie können die enthaltenen statischen Inhalte von Django sowie vom Nutzer hochgeladene Medien in Cloud Storage speichern.
Das Paket django-storages[google]
verarbeitet die Interaktion von Django mit diesem Speicher-Back-End.
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
Das gsutil
-Befehlszeilentool wurde im Rahmen der Installation der gcloud-Befehlszeile installiert.
Erstellen Sie einen Cloud Storage-Bucket:
gsutil mb -l REGION gs://PROJECT_ID_MEDIA_BUCKET
Ersetzen Sie
MEDIA_BUCKET
durch ein Suffix für den media-Bucket. In Kombination mit der Projekt-ID wird dadurch ein eindeutiger Bucket-Name erstellt.
Secret-Werte im Secret Manager speichern
Nachdem die Sicherungsdienste nun konfiguriert sind, benötigt Django Informationen zu diesen Diensten. Anstatt diese Werte direkt in den Django-Quellcode einzufügen, verwendet diese Anleitung Secret Manager, um diese Informationen sicher zu speichern.
Cloud Run und Cloud Build interagieren über die jeweiligen Dienstkonten mit Secrets. Dienstkonten werden durch eine E-Mail-Adresse identifiziert, die die Projektnummer enthält.Django-Umgebungsdatei als Secret Manager-Secret erstellen
Sie speichern die Einstellungen, die zum Starten von Django erforderlich sind, in einer gesicherten Umgebung.
Die Beispielanwendung verwendet die Secret Manager API, um den Secret-Wert abzurufen, und das Paket django-environ
, um die Werte in die Django-Umgebung zu laden. Das Secret ist so konfiguriert, dass es für Cloud Run und Cloud Build zugänglich ist.
Erstellen Sie eine Datei mit dem Namen
.env
und definieren Sie den Datenbank-Verbindungsstring, den Namen des Medien-Buckets sowie einen neuenSECRET_KEY
-Wert: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
Speichern Sie das Secret in Secret Manager:
Console
Rufen Sie in der Cloud Console die Seite Secret-Manager auf.
Klicken Sie auf Secret erstellen.
Geben Sie im Feld Name
django_settings
ein.Fügen Sie im Dialogfeld Secret-Wert den Inhalt Ihrer
.env
-Datei ein.Klicken Sie auf Secret erstellen.
Notieren Sie sich die unter Details für django_settings angezeigte Projektnummer:
projects/PROJECTNUM/secrets/django_settings
Löschen Sie die lokale Datei, um lokale Einstellungsüberschreibungen zu verhindern.
gcloud
Erstellen Sie das neue Secret
django_settings
mit dem Wert der Datei.env
:gcloud secrets create django_settings --data-file .env
Prüfen Sie Folgendes, um die Erstellung des Secrets zu bestätigen:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
Rufen Sie den Wert der Projektnummer ab (
PROJECTNUM
):export PROJECTNUM=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
Löschen Sie die lokale Datei, um lokale Einstellungsüberschreibungen zu verhindern:
rm .env
Konfigurieren Sie den Zugriff auf das Secret:
Console
- Klicken Sie auf den Tab Berechtigungen.
- Klicken Sie auf Add.
- Geben Sie in das Feld Neue Mitglieder
PROJECTNUM-compute@developer.gserviceaccount.com
ein und drücken Sie dannEnter
. - Geben Sie in das Feld Neue Mitglieder
PROJECTNUM@cloudbuild.gserviceaccount.com
ein und drücken Sie dannEnter
. - Wählen Sie im Drop-down-Menü Rolle die Option Secret Manager Secret Accessor aus.
- Klicken Sie auf Speichern.
gcloud
Gewähren Sie Zugriff auf das Secret für das Cloud Run-Dienstkonto:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Gewähren Sie dem Cloud Build-Dienstkonto Zugriff auf das Secret:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Achten Sie in der Ausgabe darauf, dass
bindings
die beiden Dienstkonten als Mitglieder auflistet.
Secret für das Administratorpasswort von Django erstellen
Der Django-Administrator wird normalerweise durch Ausführen des interaktiven Verwaltungsbefehls createsuperuser
erstellt.
In dieser Anleitung wird eine Datenmigration verwendet, um den Administrator zu erstellen, wobei das Administrator-Passwort aus Secret Manager abgerufen wird.
Console
- Rufen Sie in der Cloud Console die Seite Secret-Manager auf.
Klicken Sie auf Secret erstellen.
Geben Sie im Feld Name
superuser_password
ein.Geben Sie in das Feld Secret-Wert ein eindeutiges Passwort ein.
Klicken Sie auf Secret erstellen.
Notieren Sie sich die unter Details für
superuser_password
angegebene Projektnummer (projects/PROJECTNUM/secrets/superuser_password
).Klicken Sie auf den Tab Berechtigungen.
Klicken Sie auf Add.
Geben Sie in das Feld Neue Mitglieder
PROJECTNUM@cloudbuild.gserviceaccount.com
ein und drücken Sie dannEnter
.Wählen Sie im Drop-down-Menü Rolle die Option Secret Manager Secret Accessor aus.
Klicken Sie auf Speichern.
gcloud
Erstellen Sie ein neues Secret mit dem Namen
superuser_password
aus einem zufällig generierten Passwort:echo -n "$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1)" | gcloud secrets create superuser_password --data-file -
Gewähren Sie Cloud Build Zugriff auf das Secret:
gcloud secrets add-iam-policy-binding superuser_password \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Achten Sie in der Ausgabe darauf, dass
bindings
nur Cloud Build als Mitglied auflistet.
Cloud Build Zugriff auf Cloud SQL gewähren
Damit Cloud Build die Datenbankmigrationen anwenden kann, müssen Sie Berechtigungen für Cloud Build erteilen, um auf Cloud SQL zugreifen zu können.
Console
Rufen Sie in der Cloud Console die Seite Identity and Access Management auf.
Klicken Sie auf
Bearbeiten, um den Eintrag fürPROJECTNUM@cloudbuild.gserviceaccount.com
zu bearbeiten.Klicken Sie auf Weitere Rolle hinzufügen.
Wählen Sie im Dialogfeld Rolle auswählen die Option Cloud SQL-Client aus.
Klicken Sie auf Speichern.
gcloud
Gewähren Sie Cloud Build die Berechtigung, auf Cloud SQL zuzugreifen:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
App auf lokalem Computer ausführen
Nachdem die Sicherungsdienste konfiguriert wurden, können Sie die App jetzt auf Ihrem Computer ausführen. Diese Konfiguration ermöglicht die lokale Entwicklung und Anwendung von Datenbankmigrationen. Beachten Sie, dass Datenbankmigrationen auch in Cloud Build angewendet werden. Sie benötigen diese lokale Einrichtung jedoch für makemigrations
.
Starten Sie den Cloud SQL Auth-Proxy in einem separaten Terminal:
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
Dadurch wird eine Verbindung vom lokalen Computer zur Cloud SQL-Instanz hergestellt, sodass lokale Tests durchgeführt werden können. Brechen Sie die Ausführung des Cloud SQL Auth-Proxys nicht ab, solange Sie die Anwendung noch lokal testen. Wenn Sie diesen Prozess in einem separaten Terminal ausführen, können Sie weiter arbeiten, während dieser Prozess ausgeführt wird.
Legen Sie in einem neuen Terminal die Projekt-ID lokal fest (von der Secret Manager API verwendet):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Legen Sie eine Umgebungsvariable fest, die angibt, dass Sie den Cloud SQL Auth-Proxy verwenden (dieser Wert wird im Code erkannt):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
set USE_CLOUD_SQL_AUTH_PROXY=true
Führen Sie die Django-Migrationen aus, um die Modelle und Assets einzurichten:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Starten Sie den Django-Webserver:
python manage.py runserver
Wechseln Sie in Ihrem Browser zu http://localhost:8000.
Auf der Seite wird der folgende Text angezeigt: "Hello, world. Sie befinden sich im Umfragenindex." Der auf Ihrem Computer ausgeführte Django-Webserver stellt die Beispiel-App-Seiten bereit.
Drücken Sie
Ctrl
/Cmd
+C
, um den lokalen Webserver zu beenden.
Anwendung für Cloud Run bereitstellen
Da die Sicherungsdienste nun eingerichtet sind, können Sie jetzt den Cloud Run-Dienst bereitstellen.
Verwenden Sie die bereitgestellte Datei
cloudmigrate.yaml
, um mithilfe von Cloud Build das Image zu erstellen, die Datenbankmigrationen auszuführen und die statischen Assets zu füllen:gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
Dieser erste Build-Vorgang kann einige Minuten dauern.
Wenn der Build erfolgreich ist, stellen Sie den Cloud Run-Dienst zum ersten Mal bereit. Legen Sie die Dienstregion, das Basis-Image und die verbundene Cloud SQL-Instanz fest:
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
Aus der angezeigten Ausgabe sollte hervorgehen, dass die Bereitstellung erfolgreich war, und es sollte eine Dienst-URL ausgegeben werden:
Service [polls-service] revision [polls-service-00001-tug] has been deployed and is serving 100 percent of traffic at https://polls-service-<hash>-uc.a.run.app
Nachdem Sie die Dienst-URL aufgerufen haben, aktualisieren Sie den Dienst, damit dieser Wert als Umgebungsvariable festgelegt werden kann:
SERVICE_URL=$(gcloud run services describe polls-service --platform managed \ --region REGION --format "value(status.url)") gcloud run services update polls-service \ --platform managed \ --region REGION \ --set-env-vars CLOUDRUN_SERVICE_URL=$SERVICE_URL
Rufen Sie die Dienst-URL auf, um sich den bereitgestellten Dienst anzeigen zu lassen.
Wenn Sie sich als Django-Administrator anmelden möchten, fügen Sie
/admin
an die URL an und melden Sie sich mit dem Nutzernamenadmin
und dem zuvor festgelegten Passwort an.
Anwendung aktualisieren
Die ersten Schritte zum Bereitstellen waren zwar komplex, aber die Aktualisierung ist einfacher:
Führen Sie das Build- und Migrationsskript von Cloud Build aus:
gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
Stellen Sie den Dienst bereit und geben Sie dabei nur die Region und das Image an:
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service
Für die Produktion konfigurieren
Sie haben jetzt eine funktionierende Django-Bereitstellung, es können jedoch weitere Schritte ausgeführt werden, damit Ihre Anwendung produktionsbereit ist.
Debugging deaktivieren
Prüfen Sie, ob die Variable DEBUG
in mysite/settings.py
auf False
festgelegt ist. Dadurch werden für Nutzer keine detaillierten Fehlerseiten angezeigt, die Informationen über die Konfigurationen auslesen können.
Berechtigungen für Datenbanknutzer einschränken
Alle Nutzer, die mit Cloud SQL erstellt wurden, haben die Berechtigungen, die der Rolle cloudsqlsuperuser
zugeordnet sind: CREATEROLE
, CREATEDB
und LOGIN
.
Erstellen Sie den Nutzer in PostgreSQL manuell, um diese Berechtigungen zu vermeiden. Das interaktive psql
-Terminal muss installiert sein oder nutzen Sie Cloud Shell, wo das Tool vorinstalliert ist.
Console
-
In the Google Cloud console, activate Cloud Shell.
Verwenden Sie in Cloud Shell den integrierten
INSTANCE_NAME
-Client, um eine Verbindung zur Instanz herzustellen:gcloud sql connect INSTANCE_NAME --user postgres
Geben Sie das Nutzerpasswort für Postgres ein.
Sie verwenden jetzt
psql
. Diepostgres=>
-Eingabeaufforderung sollte nun angezeigt werden.Erstellen Sie einen Nutzer:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Ersetzen Sie
PASSWORD
durch ein zufälliges, eindeutiges Passwort.Gewähren Sie dem neuen Nutzer uneingeschränkte Rechte für die neue Datenbank:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Beenden Sie
psql
:\q
gcloud
Starten Sie eine Verbindung zur SQL-Instanz:
gcloud sql connect INSTANCE_NAME --user postgres
Ersetzen Sie
INSTANCE_NAME
durch die erstellte Cloud SQL-Instanz.Geben Sie das Nutzerpasswort für Postgres ein.
Sie verwenden jetzt
psql
. Diepostgres=>
-Eingabeaufforderung sollte nun angezeigt werden.Erstellen Sie einen Nutzer:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Gewähren Sie dem neuen Nutzer uneingeschränkte Rechte für die neue Datenbank:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Beenden Sie
psql
:\q
Mindestberechtigungen festlegen
Dieser Dienst wird mit dem Compute-Standarddienstkonto bereitgestellt. In einigen Fällen kann die Verwendung des Standarddienstkontos jedoch zu viele Berechtigungen bieten. Wenn Sie die Beschränkungen einschränken möchten, müssen Sie ein eigenes Dienstkonto erstellen und nur die Berechtigungen zuweisen, die von Ihrem Dienst benötigt werden. Die erforderlichen Berechtigungen können je nach Dienst und je nach den von einem bestimmten Dienst verwendeten Ressourcen variieren.
Für diesen Dienst sind mindestens die folgenden Projektrollen erforderlich:
- Cloud Run-Aufrufer
- Cloud SQL-Client
- Storage-Administrator, im media-Bucket
- Zugriffsfunktion für Secret Manager für das Django-Einstellungens-Secret. Der Zugriff auf das Django-Administrator-Secret ist für den Dienst selbst nicht erforderlich.
Führen Sie den folgenden Befehl aus, um ein Dienstkonto mit den erforderlichen Berechtigungen zu erstellen und dem Dienst zuzuweisen:
Erstellen Sie in der gcloud-Befehlszeile ein Dienstkonto mit den erforderlichen Rollen:
gcloud iam service-accounts create polls-service-account SERVICE_ACCOUNT=polls-service-account@PROJECT_ID.iam.gserviceaccount.com # Cloud Run Invoker gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/run.invoker # Cloud SQL Client gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/cloudsql.client # Storage Admin, on the media bucket gsutil iam ch \ serviceAccount:${SERVICE_ACCOUNT}:roles/storage.objectAdmin \ gs://MEDIA_BUCKET # Secret Accessor, on the Django settings secret. gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/secretmanager.secretAccessor
Stellen Sie den Dienst bereit und verknüpfen Sie ihn mit dem neuen Dienstkonto:
gcloud run services update polls-service \ --platform managed \ --region REGION \ --service-account ${SERVICE_ACCOUNT}
Den Code verstehen
Beispielanwendung
Die Django-Beispiel-App wurde mit den Django-Standardtools erstellt. Mit den folgenden Befehlen werden das Projekt und die Umfrage-App erstellt:
django-admin startproject mysite
python manage.py startapp polls
Die grundlegenden Ansichten, Modelle und Routenkonfigurationen werden aus Erste Django-Anwendung schreiben (Teil 1 und Teil 2) kopiert.
Secrets aus Secret Manager
Die Datei settings.py
enthält Code, der die Secret Manager Python API verwendet, um die neueste Version des benannten Secrets abzurufen und sie mithilfe von django-environ
in die Umgebung abzurufen:
Mit dem Secret wurden mehrere Secret-Werte gespeichert, um die Anzahl der verschiedenen Secrets zu reduzieren, die konfiguriert werden mussten.
Obwohl superuser_password
direkt über die Befehlszeile hätte erstellt werden können, wurde stattdessen die dateibasierte Methode verwendet. Beim Generieren über die Befehlszeile wurde mit head -c
geprüft, wie lange der verwendete, zufällig generierte String ist. Gleichzeitig wurde sichergestellt, dass am Ende der Datei kein Zeilenvorschubzeichen enthalten war. Dies hätte bei der Eingabe des Passworts als Django-Administrator zu Problemen geführt.
CSRF-Konfigurationen
JWT verfügt über einen integrierten Schutz vor Cross-Site Request Forgery (CSRF). In JWT 4.0 wird die Funktionsweise von Änderungen an der Funktionsweise durch JWT 4.0 verändert. Damit ist es für Nutzer, die Daten senden, am besten geschützt.
Sie geben die URL der App als Umgebungsvariable in der Datei settings.py
an. Dies ist der Wert, den JWT für die relevanten Einstellungen verwendet.
Lokale Secret-Überschreibungen
Wenn im lokalen Dateisystem eine .env
-Datei gefunden wird, wird sie anstelle des Werts aus Secret Manager verwendet. Eine lokale .env
-Datei kann bei lokalen Tests hilfreich sein (z. B. bei der lokalen Entwicklung einer SQLite-Datenbank oder anderen lokalen Einstellungen).
Datenbankverbindung
Die Datei settings.py
enthält die Konfiguration für Ihre SQL-Datenbank. Wenn Sie USE_CLOUD_SQL_AUTH_PROXY
festlegen, wird die Einstellung DATABASES
geändert, um die Verwendung des Cloud SQL Auth-Proxys abzuleiten.
In der Cloud gespeicherte statische Dateien
Die Datei settings.py
verwendet auch django-storages
, um den Cloud Storage-Medien-Bucket direkt in das Projekt einzubinden:
Automatisierung mit Cloud Build
Die cloudmigrate.yaml
-Datei führt nicht nur die typischen Image-Build-Schritte aus, mit denen das Container-Image erstellt und in die Container Registry übertragen wird, sondern auch die Django-Befehle migrate
und collectstatic
. Diese benötigen Zugriff auf die Datenbank. Erreicht wird dies mit app-engine-exec-wrapper, einer Hilfefunktion für Cloud SQL Proxy:
In dieser Konfiguration werden Substitutionsvariablen verwendet. Wenn Sie die Werte direkt in der Datei ändern, kann das Flag --substitutions
zum Zeitpunkt der Migration weggelassen werden.
In dieser Konfiguration werden nur vorhandene Migrationen angewendet. Migrationen müssen lokal mit der Cloud SQL Auth-Proxy-Methode erstellt werden, die unter Anwendung lokal ausführen definiert ist. Diese Vorlage kann bei Bedarf auf andere manage.py
-Befehle erweitert werden.
Wenn Sie die Cloud Build-Konfiguration erweitern möchten, um die Bereitstellung in eine einzige Konfiguration aufzunehmen, ohne zwei Befehle ausführen zu müssen, finden Sie weitere Informationen unter Kontinuierliche Bereitstellung aus Git mit Cloud Build. Dies erfordert die beschriebenen IAM-Änderungen.
Superuser-Erstellung mit Datenmigrationen
Der Django-Verwaltungsbefehl createsuperuser
kann nur interaktiv ausgeführt werden, das heißt, wenn der Nutzer Informationen als Reaktion auf eine Eingabeaufforderung eingeben kann. Sie können diesen Befehl zwar mit dem Cloud SQL-Proxy verwenden und Befehle innerhalb einer lokalen Docker-Konfiguration ausführen, Sie können den Superuser aber auch als Datenmigration erstellen:
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
- 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.
Weitere Informationen
- PostgreSQL für die Produktion konfigurieren
- Weitere Informationen zu Django in Google Cloud