Django in der Cloud Run-Umgebung ausführen

Das Bereitstellen von zustandsorientierten Anwendungen in Cloud Run wie Django erfordert 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 3 verwendet, das mindestens Python 3.7 erfordert.

Ziele

In dieser Anleitung wird Folgendes beschrieben:

  • Cloud SQL-Datenbank erstellen und verbinden
  • Secret Manager-Secret-Werte erstellen und verwenden.
  • Django-Anwendung in Cloud Run bereitstellen

  • Statische Dateien in Cloud Storage hosten

  • Bereitstellung mit Cloud Build automatisieren

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch 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. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs aktivieren.

    Aktivieren Sie die APIs

  5. Installieren und initialisieren Sie das Cloud SDK.
  6. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  7. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  8. Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs aktivieren.

    Aktivieren Sie die APIs

  9. Installieren und initialisieren Sie das Cloud SDK.
  10. 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 nutzt Python, um die Beispielanwendung auf Ihrem Computer auszuführen. Für den Beispielcode sind auch Abhängigkeiten erforderlich.

Weitere Informationen finden Sie im Leitfaden für die Python-Entwicklungsumgebung.

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

     python -V
    

    Sie sollten Python 3.7.3 oder höher sehen.

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

Beim Bereitstellen verwendet Ihre Anwendung den in die Cloud Run-Umgebung integrierten Cloud SQL Auth-Proxy, um mit Ihrer 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 in der Cloud SQL-Authentifizierungs-Proxy-Anleitung.

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.

  1. Authentifizieren Sie die Anmeldedaten für die API und rufen Sie sie 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:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
      
    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:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
      
    2. Wenn der Befehl wget nicht gefunden wird, führen Sie sudo apt-get install wget 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://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
      
    2. Machen Sie den Cloud SQL Auth-Proxy ausführbar:
      chmod +x cloud_sql_proxy
      

    macOS 32-Bit

    1. Laden Sie den Cloud SQL Auth-Proxy herunter:
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
      
    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://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 in cloud_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 in cloud_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.19.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 Standort verweisen.

Sicherungsdienste erstellen

In dieser Anleitung werden mehrere 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 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 die größte Unterstützung für PostgreSQL. PostgreSQL wird von Cloud SQL unterstützt, daher wird in dieser Anleitung dieser Datenbanktyp verwendet.

Im folgenden Abschnitt wird die Erstellung 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 Cloud Console zur Seite Cloud SQL-Instanzen.

      Zur Seite "Cloud SQL-Instanzen"

    2. Klicken Sie auf Instanz erstellen.

    3. Klicken Sie auf PostgreSQL.

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

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

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

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

    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. Rufen Sie auf der Instanzseite den Tab Datenbanken auf.
    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. Rufen Sie auf der Instanzseite den Tab Nutzer auf.
    2. Klicken Sie auf Nutzerkonto hinzufügen.
    3. Im Dialogfeld Nutzerkonto zur Instanz hinzufügen 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.

Cloud Storage-Bucket einrichten

Sie können die enthaltenen statischen Assets von Django sowie von Nutzern hochgeladene Medien mit Cloud Storage in einem hochverfügbaren Objektspeicher speichern. Das Paket django-storages[google] verarbeitet die Interaktion von Django mit diesem Speicher-Back-End.

Console

  1. Wechseln Sie in der Cloud Console zum Cloud Storage-Browser.

    Browser aufrufen

  2. Klicken Sie auf Bucket erstellen.
  3. Geben Sie auf der Seite Bucket erstellen die Bucket-Informationen ein. Klicken Sie auf Weiter, um mit dem nächsten Schritt fortzufahren.
    • Geben Sie unter Bucket benennen einen Namen ein, der den Anforderungen für Bucket-Namen entspricht.
    • Wählen Sie unter Standort Folgendes aus: MEDIA_BUCKET
    • Wählen Sie unter Standardspeicherklasse für Ihre Daten auswählen Folgendes aus: Standard.
    • Wählen Sie unter Zugriffssteuerung für Objekte auswählen eine Option für die Zugriffssteuerung aus.
    • Geben Sie für Erweiterte Einstellungen (optional) eine Verschlüsselungsmethode, eine Aufbewahrungsrichtlinie oder Bucket-Labels an.
  4. Klicken Sie auf Erstellen.

gcloud

Das gsutil-Befehlszeilentool wurde im Rahmen der Installation des Cloud SDK 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 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 mit Secrets über die entsprechenden Dienstkonten. Dienstkonten werden durch eine E-Mail-Adresse identifiziert, die die Projektnummer enthält.

Django-Umgebungsdatei als Secret Manager-Secret erstellen

Sie speichern die zum Starten von Django erforderlichen Einstellungen in einer sicheren Umgebungsdatei. 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 von 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 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 der Datei .env ein.

    5. Klicken Sie auf Secret erstellen.

    6. Notieren Sie sich die unter Details für django_settings angezeigte Projektnummer:

      projects/PROJECTNUM/secrets/django_settings
      
    7. Löschen Sie die lokale Datei, um das Überschreiben der lokalen Einstellung 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. 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
      
    3. Rufen Sie den Wert der Projektnummer (PROJECTNUM) ab:

      export PROJECTNUM=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
      
    4. Löschen Sie die lokale Datei, um das Überschreiben der lokalen Einstellung zu verhindern:

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

    Console

    1. Klicken Sie auf den Tab Berechtigungen.
    2. Klicken Sie auf Add.
    3. Geben Sie in das Feld Neue Mitglieder PROJECTNUM-compute@developer.gserviceaccount.com ein und drücken Sie dann Enter.
    4. Geben Sie in das Feld Neue Mitglieder PROJECTNUM@cloudbuild.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. Gewähren Sie dem Cloud Run-Dienstkonto Zugriff auf das Secret:

      gcloud secrets add-iam-policy-binding django_settings \
          --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      
    2. 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 und das Administratorpasswort aus Secret Manager abzurufen.

Console

  1. Rufen Sie in der 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 unter Details für superuser_password die Projektnummer (projects/PROJECTNUM/secrets/superuser_password).

  7. Klicken Sie auf den Tab Berechtigungen.

  8. Klicken Sie auf Add.

  9. Geben Sie in das Feld Neue Mitglieder PROJECTNUM@cloudbuild.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 aus einem zufällig generierten Passwort das neue Secret superuser_password:

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

  1. Rufen Sie in der Cloud Console die Seite Identitäts- und Zugriffsverwaltung auf.

    Zur Seite „Identitäts- und Zugriffsverwaltung“

  2. Klicken Sie auf Bearbeiten, um den Eintrag für PROJECTNUM@cloudbuild.gserviceaccount.com zu bearbeiten.

  3. Klicken Sie auf Weitere Rolle hinzufügen.

  4. Wählen Sie im Dialogfeld Rolle auswählen die Option Cloud SQL-Client aus.

  5. Klicken Sie auf Speichern.

gcloud

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

Nach der Konfiguration der Sicherungsdienste können Sie die Anwendung jetzt auf Ihrem Computer ausführen. Diese Einrichtung ermöglicht die lokale Entwicklung und die Anwendung von Datenbankmigrationen. Datenbankmigrationen werden auch in Cloud Build angewendet. Sie müssen diese lokale Einrichtung jedoch benötigen, um auf makemigrations zugreifen zu können.

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

    Mit diesem Schritt wird eine Verbindung von Ihrem lokalen Computer zu Ihrer Cloud SQL-Instanz für lokale Tests hergestellt. Lassen Sie den Cloud SQL Auth-Proxy die gesamte Zeit lang lokal testen, wenn Sie die Anwendung testen. Wenn Sie diesen Prozess in einem separaten Terminal ausführen, können Sie weiterhin damit arbeiten.

  2. 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
    
  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 Ihre 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
    
  6. 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.

  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 \
        --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
    
  3. Rufen Sie die Dienst-URL auf, um sich den bereitgestellten Dienst anzeigen zu lassen.

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

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 \
        --platform managed \
        --region REGION \
        --image gcr.io/PROJECT_ID/polls-service
    

Für die Produktion konfigurieren

Sie haben jetzt eine funktionierende Django-Bereitstellung, aber Sie können weitere Schritte ergreifen, um sicherzustellen, dass Ihre Anwendung produktionsbereit ist.

Debugging deaktivieren

Die Variable DEBUG in mysite/settings.py muss auf False festgelegt sein. Dadurch wird verhindert, dass Nutzer detaillierte Fehlerseiten aufrufen, die Informationen über die Konfigurationen weitergeben können.

Nutzerberechtigungen für Datenbank einschränken

Alle Nutzer, die mit Cloud SQL erstellt werden, haben die Berechtigungen, die der Rolle cloudsqlsuperuser zugeordnet sind: CREATEROLE, CREATEDB und LOGIN.

Erstellen Sie den Nutzer manuell in PostgreSQL, um diese Berechtigungen nicht zu erhalten. Das interaktive Terminal psql muss installiert sein oder Cloud Shell verwenden, in dem dieses Tool vorinstalliert ist.

Console

  1. Aktivieren Sie Cloud Shell in der 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 und 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 standardmäßig mit dem Compute-Standarddienstkonto bereitgestellt. In einigen Fällen bietet das Standarddienstkonto möglicherweise jedoch zu viele Berechtigungen. Wenn Sie restriktiver sein möchten, müssen Sie Ihr eigenes Dienstkonto erstellen und diesem nur die Berechtigungen zuweisen, die für Ihren Dienst erforderlich sind. Die erforderlichen Berechtigungen können je nach Ressourcen, die von einem bestimmten Dienst verwendet werden, von Dienst zu Dienst variieren.

Für diesen Dienst sind folgende Projektrollen erforderlich:

  • Cloud Run-Aufrufer
  • Cloud SQL-Client
  • Storage-Administrator, im media-Bucket
  • ManagerSecret Manager Accessor“ auf dem Secret für Django-Einstellungen. 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 ein Dienstkonto mit den erforderlichen Rollen im gcloud-Tool:

    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
    
  2. 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 von 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 mithilfe von django-environ in die Umgebung zu übertragen:

env = environ.Env(DEBUG=(bool, False))
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. 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.

Lokale Secret-Überschreibungen

Wenn eine .env-Datei im lokalen Dateisystem gefunden wird, wird sie anstelle des Werts aus Secret Manager verwendet. Das lokale Erstellen einer .env-Datei kann bei lokalen Tests helfen, z.B. bei der lokalen Entwicklung für eine 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.

# 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 gespeicherter statischer Text

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/"
DEFAULT_FILE_STORAGE = "storages.backends.gcloud.GoogleCloudStorage"
STATICFILES_STORAGE = "storages.backends.gcloud.GoogleCloudStorage"
GS_DEFAULT_ACL = "publicRead"

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:

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args: ["build", "-t", "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}", "."]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"]

  - id: "apply migrations"
    name: "gcr.io/google-appengine/exec-wrapper"
    args:
      [
        "-i",
        "gcr.io/$PROJECT_ID/${_SERVICE_NAME}",
        "-s",
        "${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}",
        "-e",
        "SETTINGS_NAME=${_SECRET_SETTINGS_NAME}",
        "--",
        "python",
        "manage.py",
        "migrate",
      ]

  - id: "collect static"
    name: "gcr.io/google-appengine/exec-wrapper"
    args:
      [
        "-i",
        "gcr.io/$PROJECT_ID/${_SERVICE_NAME}",
        "-s",
        "${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}",
        "-e",
        "SETTINGS_NAME=${_SECRET_SETTINGS_NAME}",
        "--",
        "python",
        "manage.py",
        "collectstatic",
        "--verbosity",
        "2",
        "--no-input",
      ]

substitutions:
  _INSTANCE_NAME: django-instance
  _REGION: us-central1
  _SERVICE_NAME: polls-service
  _SECRET_SETTINGS_NAME: django_settings

images:
  - "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"

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-Proxymethode erstellt werden, die unter Anwendung lokal ausführen definiert ist. Diese Vorlage kann erweitert werden, um bei Bedarf weitere manage.py-Befehle auszuführen.

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 Datenmigration

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:

import os

from django.contrib.auth.models import User
from django.db import migrations
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
from django.db.migrations.state import StateApps

import google.auth
from google.cloud import secretmanager

def createsuperuser(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
    """
    Dynamically create an admin user as part of a migration
    Password is pulled from Secret Manger (previously created as part of tutorial)
    """
    if os.getenv("TRAMPOLINE_CI", None):
        # We are in CI, so just create a placeholder user for unit testing.
        admin_password = "test"
    else:
        client = secretmanager.SecretManagerServiceClient()

        # Get project value for identifying current context
        _, project = google.auth.default()

        # Retrieve the previously stored admin password
        PASSWORD_NAME = os.environ.get("PASSWORD_NAME", "superuser_password")
        name = f"projects/{project}/secrets/{PASSWORD_NAME}/versions/latest"
        admin_password = client.access_secret_version(name=name).payload.data.decode(
            "UTF-8"
        )

    # Create a new user using acquired password, stripping any accidentally stored newline characters
    User.objects.create_superuser("admin", password=admin_password.strip())

class Migration(migrations.Migration):

    initial = True
    dependencies = []
    operations = [migrations.RunPython(createsuperuser)]

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