Cloud SQL-Datenbank-Back-ups planen

Cloud SQL-Datenbank-Back-ups planen

In dieser Anleitung wird beschrieben, wie Sie mit Cloud Scheduler und Cloud Functions manuelle Back-ups für eine Cloud SQL-Datenbank planen können.

Für diese Anleitung benötigen Sie etwa 30 Minuten.

Zuerst richten Sie die Umgebung ein. Klonen Sie dafür ein Git-Repository, das Testdatenbanken enthält, und speichern Sie diese Datenbanken in einem Cloud Storage-Bucket.

Dann erstellen Sie eine Cloud SQL for PostgreSQL-Datenbankinstanz und importieren die Testdatenbanken aus dem Cloud Storage-Bucket in die Instanz.

Nachdem die Umgebung eingerichtet wurde, erstellen Sie einen Cloud Scheduler-Job, der eine Back-up-Trigger-Nachricht zu einem geplanten Datum und einer Uhrzeit in einem Pub/Sub-Thema sendet. Die Meldung enthält Informationen zum Cloud SQL-Instanznamen und zur Projekt-ID. Die Nachricht löst eine Cloud Functions-Funktion aus. Die Funktion verwendet die Cloud SQL Admin API, um ein Datenbank-Back-up in Cloud SQL zu starten. Das folgende Diagramm veranschaulicht den Workflow:

Grafik: Workflow von Cloud Scheduler zu Pub/Sub, das eine Cloud Functions-Funktion auslöst, die das Back-up startet.

Google Cloud-Komponenten

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 Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

  • Cloud Storage: Speichert die Testdatenbanken, die Sie in Cloud SQL importieren.
  • Cloud SQL-Instanz: Enthält die Datenbank, die gesichert werden soll.
  • Cloud Scheduler: Sendet Nachrichten an ein Pub/Sub-Thema nach einem festgelegten Zeitplan.
  • Pub/Sub: Enthält Nachrichten, die vom Cloud Scheduler gesendet werden.
  • Cloud Functions: Abonnieren das Pub/Sub-Thema und führen bei Auslösung einen API-Aufruf an die Cloud SQL-Instanz aus, um das Back-up zu initiieren.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Rufen Sie in der Google Cloud Console die Seite APIs auf und aktivieren Sie die folgenden APIs:

    • Cloud SQL Admin API
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Build API
    • App Engine Admin API

    Zu „APIs“

Im weiteren Verlauf dieser Anleitung führen Sie alle Befehle über Cloud Shell aus.

Umgebung einrichten

Als Erstes klonen Sie das Repository, das die Beispieldaten enthält. Anschließend konfigurieren Sie Ihre Umgebung und erstellen benutzerdefinierte Rollen mit den Berechtigungen, die für diese Anleitung erforderlich sind.

In dieser Anleitung können Sie alles in Cloud Shell ausführen.

  1. Klonen Sie das Repository, das die Beispieldaten enthält:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    Sie verwenden die Daten aus dem Repository training-data-analyst, um eine Datenbank mit einigen Beispieldatensätzen zu erstellen.

  2. Konfigurieren Sie die folgenden Umgebungsvariablen:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-backup-tutorial"
    export BUCKET_NAME=${USER}-PostgreSQL-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlBackupCreator"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. Erstellen Sie zwei benutzerdefinierte Rollen, die nur die für diese Anleitung erforderlichen Berechtigungen haben:

    gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \
        --title "Simple Storage role" \
        --description "Grant permissions to view and create objects in Cloud Storage" \
        --permissions "storage.objects.create,storage.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Backup role" \
        --description "Grant permissions to backup data from a Cloud SQL instance" \
        --permissions "cloudsql.backupRuns.create"
    

    Diese Rollen reduzieren den Zugriffsbereich von Cloud Functions- und Cloud SQL-Dienstkonten nach dem Prinzip der geringsten Berechtigung.

Cloud SQL-Instanz erstellen

In diesem Abschnitt erstellen Sie einen Cloud Storage-Bucket und eine Cloud SQL for PostgreSQL-Instanz. Dann laden Sie die Testdatenbank in den Cloud Storage-Bucket hoch und importieren die Datenbank von dort in die Cloud SQL-Instanz.

Cloud Storage-Bucket erstellen

Sie verwenden Sie das gsutil-Befehlszeilentool zum Erstellen eines Cloud Storage-Buckets.

```sh
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
```

Cloud SQL-Instanz erstellen und zugehörigem Dienstkonto Berechtigungen erteilen

Als Nächstes erstellen Sie eine Cloud SQL-Instanz und erteilen dem zugehörigen Dienstkonto die Berechtigung zum Erstellen von Back-up-Ausführungen.

  1. Erstellen Sie eine Cloud SQL for PostgreSQL-Instanz.

    sh gcloud sql instances create ${SQL_INSTANCE} --database-version POSTGRES_13 --region ${REGION}

    Dieser Vorgang dauert einige Minuten.

  2. Prüfen Sie, ob die Cloud SQL-Instanz ausgeführt wird:

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    Die Ausgabe sieht dann ungefähr so aus:

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-backup-tutorial      POSTGRES_13       us-west2-b  db-n1-standard-1  x.x.x.x     -                RUNNABLE
    

  3. Erteilen Sie Ihrem Cloud SQL-Dienstkonto die Berechtigung zum Exportieren von Daten in Cloud Storage mit der einfachen Speicherrolle:

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Cloud SQL-Instanz mit Beispieldaten füllen

Jetzt können Sie Dateien in Ihren Bucket hochladen und die Beispieldatenbank erstellen und füllen.

  1. Wechseln Sie in das geklonten Repository:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Laden Sie die Dateien im Verzeichnis in den neuen Bucket hoch:

    gsutil cp * gs://${BUCKET_NAME}
    
  3. Beispieldatenbank erstellen im Abschnitt „Möchten Sie fortfahren (J/N)?” (J) (Ja) eingeben, um fortzufahren.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. Befüllen Sie die Datenbank. Im Abschnitt „Möchten Sie fortfahren (J/N)?” (J) (Ja) eingeben, um fortzufahren.

    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

Thema, Funktion und Planerjob erstellen

In diesem Abschnitt erstellen Sie ein benutzerdefiniertes IAM-Dienstkonto und binden es an die benutzerdefinierte SQL-Rolle, die Sie unter Umgebung einrichten erstellt haben. Anschließend erstellen Sie ein Pub/Sub-Thema und eine Cloud Functions-Funktion, die das Thema abonniert und die Cloud SQL Admin API verwendet, um ein Back-up zu initiieren. Als Letztes erstellen Sie einen Cloud Scheduler-Job, um regelmäßig eine Nachricht an das Pub/Sub-Thema zu posten.

Dienstkonto für die Cloud Functions-Funktion erstellen

Im ersten Schritt erstellen Sie ein benutzerdefiniertes Dienstkonto und binden es an die benutzerdefinierte SQL-Rolle, die Sie unter Umgebung einrichten erstellt haben.

  1. Erstellen Sie ein IAM-Dienstkonto, das von der Cloud Functions-Funktion verwendet werden soll:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Gewähren Sie dem Cloud Functions-Dienstkonto Zugriff auf die benutzerdefinierte SQL-Rolle:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

Pub/Sub-Thema erstellen

Im nächsten Schritt erstellen Sie ein Pub/Sub-Thema, mit dem die Cloud Functions-Funktion ausgelöst wird, die mit der Cloud SQL-Datenbank interagiert.

```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```

Cloud-Funktion erstellen

Als Nächstes erstellen Sie die Cloud Functions-Funktion.

  1. Erstellen Sie eine main.py-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False)
    
        try:
          request = service.backupRuns().insert(
                project=pubsub_message['project'],
                instance=pubsub_message['instance']
            )
          response = request.execute()
        except HttpError as err:
            logging.error("Could NOT run backup. Reason: {}".format(err))
        else:
          logging.info("Backup task status: {}".format(response))
    EOF
    
  2. Erstellen Sie eine requirements.txt-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. Stellen Sie den Code bereit:

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic ${PUBSUB_TOPIC} \
        --runtime python37 \
        --entry-point main \
        --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

Cloud Scheduler-Job erstellen

Als Letztes erstellen Sie einen Cloud Scheduler-Job, um die Daten-Back-up-Funktion regelmäßig auf stündlicher Basis auszulösen. Cloud Scheduler verwendet für die Bereitstellung eine App Engine-Instanz.

  1. Erstellen Sie eine App Engine-Instanz für den Cloud Scheduler-Job:

    gcloud app create --region=${REGION}
    
  2. Cloud Scheduler-Job erstellen:

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
    --schedule "0 * * * *" \
    --topic ${PUBSUB_TOPIC} \
    --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \
    --time-zone 'America/Los_Angeles'
    

Lösung testen

Im letzten Schritt testen Sie Ihre Lösung. Dazu führen Sie als Erstes den Cloud Scheduler-Job aus.

  1. Führen Sie den Cloud Scheduler-Job manuell aus, um einen PostgreSQL-Dump Ihrer Datenbank auszulösen.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. Listen Sie die Vorgänge auf, die für die PostgreSQL-Instanz ausgeführt wurden. Prüfen Sie, ob ein Vorgang vom Typ BACKUP_VOLUME vorhanden ist:

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    Die Ausgabe zeigt einen abgeschlossenen Back-up-Job. Beispiel:

    NAME                                  TYPE           START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  BACKUP_VOLUME  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    

Bereinigen

Wenn Sie Kosten für Ihr Google Cloud-Konto für die in dieser Anleitung verwendeten Ressourcen vermeiden möchten, können Sie die folgenden Schritte ausführen. Am einfachsten vermeiden Sie weitere Kosten, indem Sie das für die Anleitung erstellte Projekt löschen.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Wenn Sie nicht das gesamte Projekt löschen möchten, löschen Sie alle erstellten Ressourcen. Rufen Sie dazu die entsprechenden Seiten in der Google Cloud Console auf, wählen Sie die Ressource aus und löschen Sie sie.

Nächste Schritte