Como agendar backups


Neste tutorial, mostramos como programar backups para instâncias de Filestore de nível HDD básico e SSD básico, usando o Cloud Scheduler e o Cloud Functions.

Objetivos

  • Crie uma conta de serviço do cliente para o Cloud Scheduler com as credenciais necessárias para invocar uma função do Cloud Functions.
  • Crie uma conta de serviço do cliente para uso pelo Cloud Functions com as credenciais para chamar o endpoint do Filestore.
  • Criar uma função do Cloud Functions que cria (ou exclui) um backup de um compartilhamento de arquivos.
  • Criar um job do Cloud Scheduler que execute a função de criação de backups (ou excluir backups) em intervalos regulares.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Cloud Scheduler, Cloud Functions, and Filestore.

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  9. Ative as APIs Cloud Scheduler, Cloud Functions, and Filestore.

    Ative as APIs

  10. Instale a CLI do Google Cloud.
  11. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  12. Se você não tem uma instância do Filestore no seu projeto, primeiro é necessário criar uma.

Criar contas de serviço do cliente para o Cloud Scheduler e o Cloud Functions

  1. Crie uma conta de serviço de cliente em que o Cloud Scheduler seja executado para invocar uma função do Cloud Functions. Neste exemplo, use o comando iam service-accounts create para nomear a conta como schedulerunner e definir o nome de exibição como "Service Account for FS Backups-Scheduler":

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  2. Crie uma conta de serviço de cliente em que o Cloud Functions seja executado para chamar o endpoint do Filestore. Neste exemplo, chamamos a conta backupagent e definimos o nome de exibição como "Conta de serviço para FS Backups-GCF":

    gcloud iam service-accounts create backupagent \
        --display-name="Service Account for FS Backups-GCF"
    

    Verifique se a conta de serviço foi criada executando o comando iam service-accounts list:

    gcloud iam service-accounts list
    

    O comando retorna algo assim:

    NAME                                         EMAIL                                                   DISABLED
    Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
    

Configurar variáveis de ambiente

Configure as seguintes variáveis no seu ambiente local:

  • ID do projeto e projeto do Google Cloud:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format='value(projectNumber)'`
    
  • O agente de serviço do Cloud Scheduler e as contas de serviço do cliente para o Cloud Scheduler e o Cloud Functions:

    export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
    
  • Sua instância do Filestore:

    export FS_ZONE=zone
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    Substitua:

    • zone é a zona em que a instância do Filestore reside.
    • instance-id é o ID de instância do Filestore;
    • file-share-name é o nome que você especifica para o compartilhamento de arquivos NFS que é exibido pela instância.
  • Configure variáveis de ambiente para o backup do Filestore:

    export FS_BACKUP_LOCATION=region
    

    Substitua region pelo armazenamento de dados em que você quer armazenar o backup.

Criar uma função que cria um backup

  1. No console do Google Cloud, acesse a página do Cloud Functions.

    Acessar a página "Cloud Functions"

  2. Clique em Criar função e configure a função da seguinte maneira:

    • Conceitos básicos:
      • Nome da função: para este exemplo, nomeamos a função fsbackup.
      • Região: neste exemplo, usamos us-central1.
    • Acionador:
      • Tipo de acionador:HTTP.
      • Autenticação: Require authentication.
    • Configurações de ambiente de execução, criação e conexão:
      • Conta de serviço do ambiente de execução: Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com).
      • Configurações de entrada: Allow all traffic.
    • Código-fonte: Inline editor.
    • runtime: Python 3.7.
    • Ponto de entrada: create_backup.
    • Em requirements.txt, adicione as seguintes dependências:

      google-auth==1.19.2
      requests==2.24.0
      
    • Copie o seguinte exemplo de código Python no editor in-line main.py:

      Criar backups

      Este exemplo de código cria um backup chamado mybackup- anexado ao horário de criação.

      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_ZONE = 'filestore-zone'
      SOURCE_INSTANCE_NAME = 'filestore-name'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      def get_backup_id():
          return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
      
      def create_backup(request):
          trigger_run_url = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
          headers = {
            'Content-Type': 'application/json'
          }
          post_data = {
            "description": "my new backup",
            "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_ZONE, SOURCE_INSTANCE_NAME),
            "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
          }
          print("Making a request to " + trigger_run_url)
          r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
          data = r.json()
          print(data)
          if r.status_code == requests.codes.ok:
            print(str(r.status_code) + ": The backup is uploading in the background.")
          else:
            raise RuntimeError(data['error'])
      

      Substitua:

      • project-id pelo ID do projeto do Google Cloud da instância de origem do Filestore.
      • filestore-zone é a zona da instância de do Filestore origem.
      • filestore-name pelo nome da instância de origem do Filestore.
      • file-share-name pelo nome do compartilhamento de arquivos.
      • backup-region pela região para armazenar o backup.

      Excluir backups

      Este exemplo de código exclui backups anteriores a um período predefinido.

      Configure essa função da mesma forma que a função de criação de backups, exceto a seguinte:

      • Nome da função: deletefsbackups.
      • Ponto de entrada: delete_backup.
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      now = time.time()
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          list = []
          trigger_run_url = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
          r = authed_session.get(trigger_run_url)
          data = r.json()
          if not data:
              print("No backups to delete.")
          else:
              list.extend(data['backups'])
              while 'nextPageToken' in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  list.extend(data['backups'])
          for i in list:
              backup_time = i['createTime']
              backup_time = backup_time[:-4]
              backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
              if now - backup_time > retention_seconds:
                  print("Deleting " + i['name'] + " in the background.")
                  r = authed_session.delete("https://file.googleapis.com/v1beta1/{}".format(i['name']))
                  data = r.json()
                  print(data)
                  if r.status_code == requests.codes.ok:
                    print(str(r.status_code) + ": Deleting " + i['name'] + " in the background.")
                  else:
                    raise RuntimeError(data['error'])
      

      Substitua:

      • project-id pelo ID do projeto do Google Cloud do backup.
      • region pela região em que os backups estão armazenados.
      • hours pelo número de horas para manter os backups. Por exemplo, se você quiser reter backups por 10 dias, digite 240.

Atribuir papéis do IAM às contas de serviço do cliente

  1. Adicione o agente de serviço do Cloud Scheduler à política do IAM da conta de serviço do cliente do Cloud Scheduler com o papel de roles/cloudscheduler.serviceAgent. Isso permite que o agente de serviço representa a conta de serviço do cliente para invocar a função que cria um backup. Execute o comando iam service-accounts add-iam-policy-binding:

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. Atribua o papel roles/file.editor à conta de serviço do cliente do Cloud Functions para que ela faça chamadas ao endpoint do Filestore. Execute o comando projects add-iam-policy-binding:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Conceda à conta de serviço do cliente do Cloud Scheduler o papel de roles/cloudfunctions.invoker para a função fsbackup. Execute o seguinte comando functions add-iam-policy-binding:

    gcloud functions add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    Agora, apenas a conta de serviço do cliente do Cloud Scheduler pode invocar fsbackup.

Criar um job do Cloud Scheduler que aciona a função fsbackup em uma programação especificada

  1. No exemplo deste tutorial, se você quisesse programar um backup todos os dias úteis às 22h, usaria o comando scheduler jobs create http:

    gcloud beta scheduler jobs create http fsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup
    

    A sinalização --schedule é onde você especifica a frequência com que o job é executado usando a formatação unix-cron. Para detalhes, consulte Como configurar programações de cron job.

  2. Inicie o job do Cloud Scheduler criado na etapa anterior. No nosso exemplo, use o comando scheduler jobs runs:

    gcloud scheduler jobs run fsbackupschedule
    

    O job fsbackupschedule invoca a função "fsbackups" imediatamente depois que você executa o comando e a invoca novamente todos os dias da semana às 22h até que o job seja pausado.

  3. Verifique os registros da função fsbackups para ver se a função é executada corretamente e retorna um status 200.

  4. Verifique se o backup foi criado usando o comando backups list:

    gcloud beta filestore backups list
    

    O comando retorna algo semelhante a:

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

Alertas de baixa cota para backups

Se a implementação de agendamento de backups corre o risco de ficar sem cota de backups, recomendamos que você configure alertas de cota de backups baixos. Assim, você receberá uma notificação quando a cota de backups estiver baixa.

Limpar

Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto, faça o seguinte:

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir