Pianificare i backup dei database Cloud SQL

Questo tutorial mostra come utilizzare Cloud Scheduler e funzioni Cloud Run per pianificare i backup manuali per un database Cloud SQL.

Il completamento di questo tutorial richiede circa 30 minuti.

Innanzitutto, configura l'ambiente clonando un repository Git contenente database di test e archiviandoli in un bucket Cloud Storage.

Poi, crea un'istanza di database Cloud SQL per PostgreSQL e importa i database di test dal bucket Cloud Storage nell'istanza.

Dopo aver configurato l'ambiente, crea un job Cloud Scheduler che pubblica un messaggio di trigger di backup in un argomento Pub/Sub in una data e un'ora pianificate. Il messaggio contiene informazioni sul nome dell'istanza Cloud SQL e sull'ID progetto. Il messaggio attiva una funzione Cloud Run. La funzione utilizza l'API Cloud SQL Admin per avviare un backup del database su Cloud SQL. Il seguente diagramma illustra questo flusso di lavoro:

Flusso di lavoro da Cloud Scheduler a Pub/Sub, che attiva una funzione Cloud Run che avvia il backup.

Google Cloud componenti

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi Google Cloud utenti potrebbero avere diritto a una prova gratuita.

  • Cloud Storage: memorizza i database di test che importi in Cloud SQL.
  • Istanzia Cloud SQL: contiene il database di cui eseguire il backup.
  • Cloud Scheduler: pubblica i messaggi in un argomento Pub/Sub secondo una pianificazione impostata.
  • Pub/Sub: contiene i messaggi inviati da Cloud Scheduler.
  • Funzioni Cloud Run: si iscrive all'argomento Pub/Sub e, quando viene attivata, effettua una chiamata API all'istanza Cloud SQL per avviare il backup.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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. Nella console Google Cloud, vai alla pagina API e abilita le seguenti API:

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

    Vai alle API

Per il resto di questo tutorial, esegui tutti i comandi da Cloud Shell.

Configura l'ambiente

Per iniziare, devi prima clonare il repository contenente i dati di esempio. Poi, configura l'ambiente e crea ruoli personalizzati con le autorizzazioni necessarie per questo tutorial.

Puoi eseguire tutte le operazioni descritte in questo tutorial in Cloud Shell.

  1. Clona il repository che contiene i dati di esempio:

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

    Utilizza i dati del repository training-data-analyst per creare un database con alcuni record simulati.

  2. Configura le seguenti variabili di ambiente:

    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. Crea due ruoli personalizzati con solo le autorizzazioni necessarie per questo tutorial:

    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"
    

    Questi ruoli riducono l'ambito di accesso delle funzioni Cloud Run e degli account di servizio Cloud SQL, in base al principio del privilegio minimo.

Crea un'istanza Cloud SQL

In questa sezione crei un bucket Cloud Storage e un'istanza Cloud SQL per PostgreSQL. Quindi carichi il database di test nel bucket Cloud Storage e importi il database da lì nell'istanza Cloud SQL.

Crea un bucket Cloud Storage

Utilizza la gcloud CLI per creare un bucket Cloud Storage.

gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}

Crea un'istanza Cloud SQL e concedi le autorizzazioni al relativo account di servizio

Poi, crea un'istanza Cloud SQL e concedi al relativo account di servizio le autorizzazioni per creare esecuzioni di backup.

  1. Crea un'istanza Cloud SQL per PostgreSQL:

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

    Il completamento dell'operazione richiede alcuni minuti.

  2. Verifica che l'istanza Cloud SQL sia in esecuzione:

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

    L'output è simile al seguente:

    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. Concedi all'account di servizio Cloud SQL le autorizzazioni per esportare i dati in Cloud Storage con il ruolo Simple Storage:

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
        --member=serviceAccount:${SQL_SA} \
        --role=projects/${PROJECT_ID}/roles/${STORAGE_ROLE}
    

Compila l'istanza Cloud SQL con dati di esempio

Ora puoi caricare file nel bucket e creare e compilare il tuo database di esempio.

  1. Vai al repository che hai clonato:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Carica i file nella directory nel nuovo bucket:

    gcloud storage cp * gs://${BUCKET_NAME}
    
  3. Crea un database di esempio. Alla richiesta "Vuoi continuare (Y/n)?", digita Y (Sì) per continuare.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. Compila il database. Alla richiesta "Vuoi continuare (Y/n)?", invia Y (Sì) per continuare.

    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
    

Crea un argomento, una funzione e un job Scheduler

In questa sezione crei un account di servizio IAM personalizzato e lo associ al ruolo SQL personalizzato che hai creato in Configurare l'ambiente. Poi crei un argomento Pub/Sub e una funzione Cloud Run che si iscrive all'argomento e utilizza l' API Cloud SQL Admin per avviare un backup. Infine, crei un job Cloud Scheduler per pubblicare periodicamente un messaggio nell'argomento Pub/Sub.

Crea un account di servizio per la funzione Cloud Run

Il primo passaggio consiste nel creare un account di servizio personalizzato e associarlo al ruolo SQL personalizzato che hai creato in Configurare l'ambiente.

  1. Crea un account di servizio IAM da utilizzare dalla funzione Cloud Run:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Concedi all'account di servizio della funzione Cloud Run l'accesso al ruolo SQL personalizzato:

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

crea un argomento Pub/Sub

Il passaggio successivo consiste nel creare un argomento Pub/Sub utilizzato per attivare la funzione Cloud Run che interagisce con il database Cloud SQL.

gcloud pubsub topics create ${PUBSUB_TOPIC}

Crea una funzione Cloud Run

A questo punto, crea la funzione Cloud Run.

  1. Crea un file main.py incollando quanto segue in Cloud Shell:

    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. Crea un file requirements.txt incollando quanto segue in Cloud Shell:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. Esegui il deployment del codice:

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

Crea un job Cloud Scheduler

Infine, crea un job Cloud Scheduler per attivare periodicamente la funzione di backup dei dati su base oraria. Cloud Scheduler utilizza un'istanza App Engine per il deployment.

  1. Crea un'istanza App Engine per il job Cloud Scheduler:

    gcloud app create --region=${REGION}
    
  2. Crea un job Cloud Scheduler:

    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'
    

Testa la soluzione

Il passaggio finale consiste nel testare la soluzione. Per iniziare, esegui il job Cloud Scheduler.

  1. Esegui manualmente il job Cloud Scheduler per attivare un dump PostgreSQL del tuo database.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. Elenca le operazioni eseguite sull'istanza PostgreSQL e verifica che sia presente un'operazione di tipo BACKUP_VOLUME:

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

    L'output mostra un job di backup completato. Ad esempio:

    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
    

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, segui questi passaggi. Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.

  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.

Se non vuoi eliminare l'intero progetto, elimina ciascuna delle risorse che hai creato. Per farlo, vai alle pagine appropriate nella console Google Cloud, seleziona la risorsa ed eliminala.

Passaggi successivi