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:
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.
- 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
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
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
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.
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.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"
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.
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.
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
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.
Wechseln Sie in das geklonten Repository:
cd training-data-analyst/CPB100/lab3a/cloudsql
Laden Sie die Dateien im Verzeichnis in den neuen Bucket hoch:
gsutil cp * gs://${BUCKET_NAME}
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}
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.
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"
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.
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
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
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.
Erstellen Sie eine App Engine-Instanz für den Cloud Scheduler-Job:
gcloud app create --region=${REGION}
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.
Führen Sie den Cloud Scheduler-Job manuell aus, um einen PostgreSQL-Dump Ihrer Datenbank auszulösen.
gcloud scheduler jobs run ${SCHEDULER_JOB}
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.
- 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.
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
- Compute-Instanzen mit Cloud Scheduler planen
- Weitere Informationen zu Cloud SQL-Back-ups
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center