Django in der Cloud Run-Umgebung ausführen

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 Django 5 verwendet, das mindestens Python 3.10 erfordert.

Ziele

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.

Neuen Nutzern von Google Cloud steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Installieren Sie die gcloud CLI.

  6. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  7. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  8. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Installieren Sie die gcloud CLI.

  12. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  13. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  14. 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.

  1. 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
    
  2. 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.

  1. Prüfen Sie, ob Python mindestens Version 3.10 hat.

     python -V
    

    Sie sollten Python 3.10.0 oder höher haben.

  2. 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 venv
    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 die gcloud CLI erforderlich.

  1. Authentifizieren und rufen Sie Anmeldedaten für die API ab:

    gcloud auth application-default login
    
  2. Laden Sie den Cloud SQL Auth-Proxy herunter und installieren Sie ihn auf Ihrem lokalen Computer.

    Linux 64-Bit

    1. Laden Sie den Cloud SQL Auth-Proxy herunter:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
    2. Machen Sie den Cloud SQL Auth-Proxy ausführbar:
      chmod +x cloud-sql-proxy

    Linux 32-Bit

    1. Laden Sie den Cloud SQL Auth-Proxy herunter:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
    2. Wenn der Befehl curl nicht gefunden wird, führen Sie sudo apt install curl aus und wiederholen Sie den Downloadbefehl.
    3. Machen Sie den Cloud SQL Auth-Proxy ausführbar:
      chmod +x cloud-sql-proxy

    macOS 64-Bit

    1. Laden Sie den Cloud SQL Auth-Proxy herunter:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
    2. Machen Sie den Cloud SQL Auth-Proxy ausführbar:
      chmod +x cloud-sql-proxy

    Mac M1

    1. Laden Sie den Cloud SQL Auth-Proxy herunter:
        curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
        
    2. 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://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x64.exe und wählen Sie Link speichern unter aus, um den Cloud SQL Auth-Proxy herunterzuladen. Benennen Sie die Datei in cloud-sql-proxy.exe um.

    Windows 32-Bit

    Klicken Sie mit der rechten Maustaste auf https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x86.exe und wählen Sie Link speichern unter aus, um den Cloud SQL Auth-Proxy herunterzuladen. Benennen Sie die Datei in cloud-sql-proxy.exe um.

    Docker-Image des Cloud SQL Auth-Proxys

    Der Cloud SQL Auth-Proxy hat verschiedene Container-Images, z. B. distroless, alpine und buster. Das standardmäßige Cloud SQL Auth-Proxy-Container-Image verwendet distroless, das keine Shell enthält. Wenn Sie eine Shell oder verwandte Tools benötigen, laden Sie ein auf alpine oder buster basierendes Image herunter. Weitere Informationen finden Sie unter Container-Images von Cloud SQL Auth-Proxy.

    Sie können das neueste Image mithilfe von Docker mit dem folgenden Befehl auf Ihren lokalen Computer übertragen:

    docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.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 von cloud-sql-proxy-Befehlen auf den ausgewählten Speicherort verweisen.

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.

  1. Erstellen Sie die PostgreSQL-Instanz:

    Console

    1. Wechseln Sie in der Google Cloud Console zur Seite Cloud SQL-Instanzen.

      Zur Seite "Cloud SQL-Instanzen"

    2. Klicken Sie auf Instanz erstellen.

    3. Klicken Sie auf PostgreSQL auswählen.

    4. Wählen Sie unter SQL-Version die Option „Enterprise“ aus.

    5. Wählen Sie unter Versionsvoreinstellung die Option „Sandbox“ aus.

    6. Geben Sie im Feld Instanz-ID den Wert INSTANCE_NAME ein.

    7. Geben Sie das Passwort für den Postgres-Nutzer ein.

    8. Übernehmen Sie für die anderen Felder die Standardwerte.

    9. Klicken Sie auf Instanz erstellen.

    Es dauert einige Minuten, bis die Instanz einsatzbereit ist.

    gcloud

    • Erstellen Sie die PostgreSQL-Instanz:

      gcloud sql instances create INSTANCE_NAME \
          --project PROJECT_ID \
          --database-version POSTGRES_16 \
          --tier db-n1-standard-2 \
          --region REGION
      

    Dabei gilt:

    • INSTANCE_NAME: der Name der Cloud SQL-Instanz
    • PROJECT_ID: die Google Cloud Projekt-ID
    • REGION: die Google Cloud -Region

    Es dauert einige Minuten, bis die Instanz erstellt und einsatzbereit ist.

  2. Erstellen Sie in der erstellten Instanz eine Datenbank:

    Console

    1. Wechseln Sie auf der Instanzseite zum Tab Datenbanken.
    2. Klicken Sie auf Datenbank erstellen.
    3. Geben Sie im Dialogfeld Datenbankname DATABASE_NAME ein.
    4. 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.

  3. Erstellen Sie einen Datenbanknutzer:

    Console

    1. Wechseln Sie auf der Instanzseite zum Tab Nutzer.
    2. Klicken Sie auf Nutzerkonto hinzufügen.
    3. Im Dialogfeld Authentifizierungstyp auswählen unter „Integrierte Authentifizierung“:
    4. Geben Sie den Nutzernamen DATABASE_USERNAME ein.
    5. Geben Sie das Passwort DATABASE_PASSWORD ein.
    6. 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.

Artifact Registry einrichten

Erstellen Sie mit Artifact Registry eine Registry zum Speichern Ihres Container-Images.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Artifact Registry auf.

    Zur Seite „Artifact Registry“

  2. Klicken Sie auf Repository erstellen.

  3. Geben Sie Folgendes ein:

    • Geben Sie unter Name den Namen „cloud-run-source-deploy“ ein.
    • Wählen Sie als Format die Option „Docker“ aus.
    • Wählen Sie bei Region die Option REGION aus.
  4. Übernehmen Sie für die anderen Felder die Standardwerte.

  5. Klicken Sie auf Erstellen.

gcloud

  • Artifact Registry erstellen:
gcloud artifacts repositories create cloud-run-source-deploy \
    --repository-format docker \
    --location REGION

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-Backend.

Console

  1. Rufen Sie in der Google Cloud -Console die Seite Cloud Storage auf.

    Zur Cloud Storage-Seite

  2. Klicken Sie auf Bucket erstellen.

  3. Geben Sie Folgendes ein (klicken Sie bei Bedarf auf „Weiter“):

    • Geben Sie unter Name den Namen „PROJECT_ID_MEDIA_BUCKET“ ein.
    • Wählen Sie bei Region die Option REGION aus.
    • Behalten Sie für Speicherklasse die Standardeinstellungen bei.
    • Entfernen Sie für Öffentlichen Zugriff verhindern das Häkchen bei „Verhinderung des öffentlichen Zugriffs erzwingen“.
    • Wählen Sie für Zugriffssteuerung die Option „Detailgenau“ aus.
  4. Übernehmen Sie für die anderen Felder die Standardwerte.

  5. Klicken Sie auf Erstellen.

gcloud

  • Erstellen Sie einen Cloud Storage-Bucket:

    gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET --location=REGION
    

    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.

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.

  1. Erstellen Sie eine Datei mit dem Namen .env und definieren Sie den Datenbank-Verbindungsstring, den Namen des Medien-Buckets sowie einen neuen SECRET_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
    
  2. Speichern Sie das Secret in Secret Manager:

    Console

    1. Rufen Sie in der Google Cloud Console die Seite „Secret Manager“ auf.

      Zur Seite „Secret Manager“

    2. Klicken Sie auf Secret erstellen.

    3. Geben Sie im Feld Name django_settings ein.

    4. Fügen Sie im Dialogfeld Secret-Wert den Inhalt Ihrer .env-Datei ein.

    5. Klicken Sie auf Secret erstellen.

    6. Löschen Sie die lokale Datei, um lokale Einstellungsüberschreibungen zu verhindern.

    gcloud

    1. Erstellen Sie das neue Secret django_settings mit dem Wert der Datei .env:

      gcloud secrets create django_settings --data-file .env
      
    2. Löschen Sie die lokale Datei, um lokale Einstellungsüberschreibungen zu verhindern:

      rm .env
      
  3. Konfigurieren Sie den Zugriff auf das Secret:

    Console

    1. Notieren Sie sich die Projektnummer unter Secret: django_settings:

      projects/PROJECTNUM/secrets/django_settings
      
    2. Klicken Sie auf den Tab Berechtigungen.

    3. Klicken Sie auf Zugriff erlauben.

    4. Geben Sie in das Feld Neue Mitglieder PROJECTNUM-compute@developer.gserviceaccount.com ein und drücken Sie dann Enter.

    5. Wählen Sie im Drop-down-Menü Rolle die Option Secret Manager Secret Accessor aus.

    6. Klicken Sie auf Speichern.

    gcloud

    1. Rufen Sie den Wert der Projektnummer ab (PROJECTNUM):

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
    
    1. 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
      

    Achten Sie in der Ausgabe darauf, dass bindings das neue Dienstkonto 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

  1. Rufen Sie in der Google Cloud Console die Seite „Secret Manager“ auf.
  2. Klicken Sie auf Secret erstellen.

  3. Geben Sie im Feld Name superuser_password ein.

  4. Geben Sie in das Feld Secret-Wert ein eindeutiges Passwort ein.

  5. Klicken Sie auf Secret erstellen.

  6. Notieren Sie sich die unter Details für superuser_password angegebene Projektnummer (projects/PROJECTNUM/secrets/superuser_password).

  7. Klicken Sie auf den Tab Berechtigungen.

  8. Klicken Sie auf Hinzufügen.

  9. Geben Sie in das Feld Neue Mitglieder PROJECTNUM-compute@developer.gserviceaccount.com ein und drücken Sie dann Enter.

  10. Wählen Sie im Drop-down-Menü Rolle die Option Secret Manager Secret Accessor aus.

  11. Klicken Sie auf Speichern.

gcloud

  1. 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 -
    
  2. Gewähren Sie Cloud Build Zugriff auf das Secret:

    gcloud secrets add-iam-policy-binding superuser_password \
        --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
        --role roles/secretmanager.secretAccessor
    

    Achten Sie in der Ausgabe darauf, dass bindings nur Cloud Build als Mitglied auflistet.

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.

  1. Starten Sie den Cloud SQL Auth-Proxy in einem separaten Terminal:

    Linux/macOS

    ./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
    

    Windows

    cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
    

    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.

  2. Legen Sie im ursprünglichen 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
    
  3. 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
    
  4. 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
    
  5. Starten Sie den Django-Webserver:

    python manage.py runserver 8080
    
  6. Rufen Sie in Ihrem Browser http://localhost:8080 auf.

    Wenn Sie Cloud Shell verwenden, klicken Sie auf die Schaltfläche Webvorschau und wählen Sie Vorschau auf Port 8080 aus.

    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.

  7. 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.

  1. 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.

  2. 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 \
        --region REGION \
        --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/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.
    Service URL: https://polls-service-PROJECT_ID.REGION.run.app
    
  3. Aktualisieren Sie den Dienst auf die Dienst-URLs als Umgebungsvariable.

    CLOUDRUN_SERVICE_URLS=$(gcloud run services describe polls-service \
        --region $REGION  \
        --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
    
    gcloud run services update polls-service \
        --region REGION \
        --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"
    
  4. Rufen Sie die Dienst-URL auf, um sich den bereitgestellten Dienst anzeigen zu lassen.

  5. Wenn Sie sich als Django-Administrator anmelden möchten, fügen Sie /admin an die URL an und melden Sie sich mit dem Nutzernamen admin und dem zuvor festgelegten Passwort an.

    So rufen Sie das Superuser-Passwort aus Secret Manager ab:

    gcloud secrets versions access latest --secret superuser_password && echo ""
    

Anwendung aktualisieren

Die ersten Schritte zum Bereitstellen waren zwar komplex, aber die Aktualisierung ist einfacher:

  1. Führen Sie das Build- und Migrationsskript von Cloud Build aus:

    gcloud builds submit --config cloudmigrate.yaml \
        --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
    
  2. Stellen Sie den Dienst bereit und geben Sie dabei nur die Region und das Image an:

    gcloud run deploy polls-service \
        --region REGION \
        --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/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

  1. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

  2. Verwenden Sie in Cloud Shell den integrierten INSTANCE_NAME-Client, um eine Verbindung zur Instanz herzustellen:

    gcloud sql connect INSTANCE_NAME --user postgres
    
  3. Geben Sie das Nutzerpasswort für Postgres ein.

    Sie verwenden jetzt psql. Die postgres=>-Eingabeaufforderung sollte nun angezeigt werden.

  4. Erstellen Sie einen Nutzer:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    

    Ersetzen Sie PASSWORD durch ein zufälliges, eindeutiges Passwort.

  5. Gewähren Sie dem neuen Nutzer uneingeschränkte Rechte für die neue Datenbank:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  6. Beenden Sie psql:

    \q
    

gcloud

  1. Starten Sie eine Verbindung zur SQL-Instanz:

    gcloud sql connect INSTANCE_NAME --user postgres
    

    Ersetzen Sie INSTANCE_NAME durch die erstellte Cloud SQL-Instanz.

  2. Geben Sie das Nutzerpasswort für Postgres ein.

    Sie verwenden jetzt psql. Die postgres=>-Eingabeaufforderung sollte nun angezeigt werden.

  3. Erstellen Sie einen Nutzer:

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    
  4. Gewähren Sie dem neuen Nutzer uneingeschränkte Rechte für die neue Datenbank:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  5. 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:

  1. Erstellen Sie in der gcloud CLI 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 SQL Client
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/cloudsql.client
    
    # Storage Admin, on the media bucket
    gcloud storage buckets add-iam-policy-binding gs://MEDIA_BUCKET \
        --member=serviceAccount:${SERVICE_ACCOUNT} \
        --role=roles/storage.objectAdmin
    
    # Secret Accessor, on the Django settings secret.
    gcloud secrets add-iam-policy-binding django_settings \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/secretmanager.secretAccessor
    
    # Secret Accessor, on the Django super user password.
    gcloud secrets add-iam-policy-binding superuser_password \
        --member serviceAccount:${SERVICE_ACCOUNT} \
        --role roles/secretmanager.secretAccessor
    
  2. Stellen Sie den Dienst bereit und verknüpfen Sie ihn mit dem neuen Dienstkonto:

    gcloud run services update polls-service \
        --region REGION \
        --service-account ${SERVICE_ACCOUNT}
    
  3. Aktualisieren Sie die Cloud Run-Jobs in cloudmigrate.yaml so, dass sie auch diese --service-account-Einstellung haben.

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:

# SECURITY WARNING: don't run with debug turned on in production!
# Change this to "False" when you are ready for production
env = environ.Env(DEBUG=(bool, True))
env_file = os.path.join(BASE_DIR, ".env")

# Attempt to load the Project ID into the environment, safely failing on error.
try:
    _, os.environ["GOOGLE_CLOUD_PROJECT"] = google.auth.default()
except google.auth.exceptions.DefaultCredentialsError:
    pass

if os.path.isfile(env_file):
    # Use a local secret file, if provided

    env.read_env(env_file)
# ...
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
    # Pull secrets from Secret Manager
    project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")

    client = secretmanager.SecretManagerServiceClient()
    settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
    name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
    payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")

    env.read_env(io.StringIO(payload))
else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")

Mit dem Secret wurden mehrere Secret-Werte gespeichert, um die Anzahl der verschiedenen Secrets zu reduzieren, die konfiguriert werden mussten.

CSRF-Konfigurationen

Django bietet integrierten Schutz vor Cross-Site-Request-Forgery (CSRF). Ab Django 4.0 ist es wichtig, Django die gehostete URL mitzuteilen, damit Nutzer, die Daten senden, bestmöglich geschützt werden.

Sie geben die URL der App als Umgebungsvariable in der Datei settings.py an. Dies ist der Wert, den Django für die relevanten Einstellungen verwendet.

# SECURITY WARNING: It's recommended that you use this when
# running in production. The URLs will be known once you first deploy
# to Cloud Run. This code takes the URLs and converts it to both these settings formats.
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]

    SECURE_SSL_REDIRECT = True
    SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
else:
    ALLOWED_HOSTS = ["*"]

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. Dazu wird der env.db()-Helfer aus django-environ verwendet, um den in DATABASE_URL festgelegten Verbindungsstring in die Einstellung DATABASES zu laden.

Wenn Sie die Anwendung lokal ausführen und über den Cloud SQL Auth-Proxy auf die gehostete Datenbank zugreifen, werden mit dem Flag USE_CLOUD_SQL_AUTH_PROXY die Datenbankeinstellungen so angepasst, dass der Proxy verwendet wird.

# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

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:

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATIC_URL = "/static/"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}
GS_DEFAULT_ACL = "publicRead"

Automatisierung mit Cloud Build

Das cloudmigrate.yaml übernimmt alle Schritte, die zum Erstellen eines neuen Container-Images und zum Anwenden von Datenbankmigrationen erforderlich sind.

In diesem Tutorial werden Buildpacks verwendet, um das Container-Image zu erstellen, und benutzerdefinierte Einstiegspunkte im ProcfileProcfile, um Verwaltungsbefehle zu verarbeiten. Cloud Run-Jobs können dann darauf verweisen, um die Befehle auszuführen.

steps:
  - id: "Build Container Image"
    name: gcr.io/k8s-skaffold/pack
    args: ["build", "${_IMAGE_NAME}", "--builder=gcr.io/buildpacks/builder"]

  - id: "Push Container Image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "${_IMAGE_NAME}"]

  - id: "Migrate database"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    args:
      - "-c"
      - |
        gcloud run jobs create migrate-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars SETTINGS_NAME=${_SECRET_SETTINGS_NAME} \
          --command migrate \
          --execute-now

  - id: "Create superuser"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    args:
      - "-c"
      - |
        gcloud run jobs create superuser-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars SETTINGS_NAME=${_SECRET_SETTINGS_NAME} \
          --set-env-vars DJANGO_SUPERUSER_EMAIL=${_ADMIN_EMAIL} \
          --set-secrets DJANGO_SUPERUSER_PASSWORD=${_ADMIN_PASSWORD_NAME}:latest \
          --command createsuperuser \
          --execute-now

options:
  dynamicSubstitutions: true

substitutions:
  _INSTANCE_NAME: django-instance
  _CLOUD_SQL_CONNECTION_NAME: ${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}
  _REGION: us-central1
  _SERVICE_NAME: polls-service
  _SECRET_SETTINGS_NAME: django_settings
  _ARTIFACT_REGISTRY: cloud-run-source-deploy
  _IMAGE_NAME: ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY}/${_SERVICE_NAME}
  _ADMIN_EMAIL: example@example.com
  _ADMIN_PASSWORD_NAME: superuser_password

images:
  - "${_IMAGE_NAME}"

In dieser Konfiguration werden Substitutionsvariablen verwendet.

Superuser-Erstellung mit Cloud Run-Jobs

Der Django-Verwaltungsbefehl createsuperuser kann nicht interaktiv ausgeführt werden, indem DJANGO_SUPERUSER_EMAIL und DJANGO_SUPERUSER_PASSWORD festgelegt werden.

In dieser Anleitung wird der Befehl mit Cloud Run-Jobs ausgeführt. Dazu wird ein benutzerdefinierter Eintrag in Procfile hinzugefügt, der createsuperuser ausführt.

# Create superuser (requires DJANGO_SUPERUSER_PASSWORD and DJANGO_SUPERUSER_EMAIL envvars)
createsuperuser: python manage.py createsuperuser --username admin --noinput || echo "User already exists."

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

  1. Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte