Agende cópias de segurança da base de dados do Cloud SQL

Este tutorial mostra como usar o Cloud Scheduler e as funções do Cloud Run para agendar cópias de segurança manuais para uma base de dados do Cloud SQL.

Este tutorial demora aproximadamente 30 minutos a concluir.

Primeiro, configura o ambiente clonando um repositório git que contém bases de dados de teste e armazenando essas bases de dados num contentor do Cloud Storage.

Em seguida, cria uma instância da base de dados do Cloud SQL para MySQL e importa as bases de dados de teste do contentor do Cloud Storage para a instância.

Depois de configurar o ambiente, cria uma tarefa do Cloud Scheduler que publica uma mensagem de acionador de cópia de segurança numa data e hora agendadas num tópico do Pub/Sub. A mensagem contém informações sobre o nome da instância do Cloud SQL e o ID do projeto. A mensagem aciona uma função do Cloud Run. A função usa a API Cloud SQL Admin para iniciar uma cópia de segurança da base de dados no Cloud SQL. O diagrama seguinte ilustra este fluxo de trabalho:

Fluxo de trabalho do Cloud Scheduler para o Pub/Sub, que aciona funções do Cloud Run que iniciam a cópia de segurança.

Google Cloud componentes

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

  • Cloud Storage: Armazena as bases de dados de teste que importa para o Cloud SQL.
  • Instância do Cloud SQL: Contém a base de dados da qual fazer uma cópia de segurança.
  • Cloud Scheduler: publica mensagens num tópico do Pub/Sub num horário definido.
  • Pub/Sub: Contém mensagens enviadas a partir do Cloud Scheduler.
  • Funções do Cloud Run: subscreve o tópico do Pub/Sub e, quando acionado, faz uma chamada API para a instância do Cloud SQL para iniciar a cópia de segurança.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  1. 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 (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  3. Na Google Cloud consola, aceda à página APIs e ative as seguintes APIs:

    • API Cloud SQL Admin
    • API Cloud Run functions
    • API do Cloud Scheduler
    • API Cloud Build
    • API App Engine Admin

    Aceder às APIs

Ao longo do resto deste tutorial, vai executar todos os comandos a partir do Cloud Shell.

Configure o seu ambiente

Para começar, clone primeiro o repositório que contém os dados de exemplo. Em seguida, configura o seu ambiente e cria funções personalizadas com as autorizações necessárias para este tutorial.

Pode fazer tudo neste tutorial no Cloud Shell.

  1. Clone o repositório que contém os dados de amostra:

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

    Usa os dados do repositório training-data-analyst para criar uma base de dados com alguns registos simulados.

  2. Configure as seguintes variáveis de ambiente:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-backup-tutorial"
    export BUCKET_NAME=${USER}-MySQL-$(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. Crie duas funções personalizadas que tenham apenas as autorizações necessárias para este 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"
    

    Estas funções reduzem o âmbito de acesso das funções do Cloud Run e das contas de serviço do Cloud SQL, seguindo o princípio do menor privilégio.

Crie uma instância do Cloud SQL

Nesta secção, cria um contentor do Cloud Storage e uma instância do Cloud SQL para MySQL. Em seguida, carrega a base de dados de teste para o contentor do Cloud Storage e importa a base de dados a partir daí para a instância do Cloud SQL.

Crie um contentor do Cloud Storage

Usa a CLI gcloud para criar um contentor do Cloud Storage.

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

Crie uma instância do Cloud SQL e conceda autorizações à respetiva conta de serviço

Em seguida, crie uma instância do Cloud SQL e conceda à respetiva conta de serviço as autorizações para criar execuções de cópias de segurança.

  1. Crie uma instância do Cloud SQL para MySQL:

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

    Esta operação demora alguns minutos a ser concluída.

  2. Verifique se a instância do Cloud SQL está em execução:

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

    O resultado tem um aspeto semelhante ao seguinte:

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

  3. Conceda à sua conta de serviço do Cloud SQL as autorizações para exportar dados para o Cloud Storage com a função de armazenamento simples:

    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}
    

Preencha a instância do Cloud SQL com dados de amostra

Agora, pode carregar ficheiros para o seu contentor, bem como criar e preencher a base de dados de amostra.

  1. Aceda ao repositório que clonou:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Carregue os ficheiros no diretório para o novo contentor:

    gcloud storage cp * gs://${BUCKET_NAME}
    
  3. Crie uma base de dados de exemplo. Na mensagem "Do you want to continue (Y/n)?" (Quer continuar [S/n]?), introduza Y (Sim) para continuar.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. Preencha a base de dados; na mensagem "Do you want to continue (Y/n)?" (Quer continuar [S/n]?), introduza Y (Sim) para continuar.

    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
    

Crie um tópico, uma função e uma tarefa do programador

Nesta secção, cria uma conta de serviço da IAM personalizada e associa-a à função SQL personalizada que criou em Configure o seu ambiente. Em seguida, cria um tópico do Pub/Sub e uma função do Cloud Run que subscreve o tópico e usa a API Cloud SQL Admin para iniciar uma cópia de segurança. Por último, cria uma tarefa do Cloud Scheduler para publicar uma mensagem no tópico do Pub/Sub periodicamente.

Crie uma conta de serviço para a função do Cloud Run

O primeiro passo é criar uma conta de serviço personalizada e associá-la à função SQL personalizada que criou em Configure o seu ambiente.

  1. Crie uma conta de serviço da IAM para ser usada pela função do Cloud Run:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Conceda à conta de serviço da função do Cloud Run acesso à função SQL personalizada:

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

Crie um tópico do Pub/Sub

O passo seguinte é criar um tópico Pub/Sub que é usado para acionar a função do Cloud Run que interage com a base de dados do Cloud SQL.

gcloud pubsub topics create ${PUBSUB_TOPIC}

Crie uma função do Cloud Run

Em seguida, crie a função do Cloud Run.

  1. Crie um ficheiro main.py colando o seguinte no 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. Crie um ficheiro requirements.txt colando o seguinte no Cloud Shell:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. Implemente o código:

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

Crie uma tarefa do Cloud Scheduler

Por último, cria uma tarefa do Cloud Scheduler para acionar periodicamente a função de cópia de segurança de dados de hora a hora. O Cloud Scheduler usa uma instância do App Engine para a implementação.

  1. Crie uma instância do App Engine para a tarefa do Cloud Scheduler:

    gcloud app create --region=${REGION}
    
  2. Crie uma tarefa do 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'
    

Teste a sua solução

O passo final é testar a sua solução. Começa por executar a tarefa do Cloud Scheduler.

  1. Execute manualmente a tarefa do Cloud Scheduler para acionar um despejo do MySQL da sua base de dados.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. Liste as operações realizadas na instância do MySQL e verifique se existe uma operação do tipo BACKUP_VOLUME:

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

    O resultado mostra uma tarefa de cópia de segurança concluída. Por exemplo:

    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
    

Limpar

Pode evitar incorrer em custos na sua Google Cloud conta pelos recursos usados neste tutorial seguindo estes passos. A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o 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 não quiser eliminar todo o projeto, elimine cada um dos recursos que criou. Para o fazer, aceda às páginas adequadas na Google Cloud consola, selecione o recurso e elimine-o.

O que se segue?