Como programar backups


Neste tutorial, mostramos como programar backups para instâncias do Filestore usando funções do Cloud Scheduler e do Cloud Run.

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 Run Functions.
  • Crie uma conta de serviço do cliente para funções do Cloud Run com as credenciais para chamar o endpoint do Filestore.
  • Crie uma função do Cloud Run que cria um backup de uma instância do Filestore.
  • Crie uma função do Cloud Run que exclui um backup de uma instância do Filestore.
  • Crie um job do Cloud Scheduler que execute qualquer função 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Se você não tiver uma instância do Filestore no seu projeto, primeiro crie uma.

Criar contas de serviço do cliente para funções do Cloud Scheduler e do Cloud Run

  1. No console do Google Cloud, clique em Ativar o Cloud Shell, se ainda não tiver feito isso.

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

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Crie uma conta de serviço de cliente em que as funções do Cloud Run sejam executadas 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"
    

    Para verificar se a conta de serviço foi criada, execute 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 as funções do Cloud Scheduler e do Cloud Run:

    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 SOURCE_INSTANCE_LOCATION=fs-location
    export SOURCE_INSTANCE_NAME=instance-id
    export SHARE_NAME=file-share-name
    

    Substitua:

    • fs-location é a zona ou região em que a instância de origem do Filestore reside.
    • instance-id é o ID de instância da instância de origem 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 BACKUP_REGION=backup-region
    

    Substitua backup-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 das funções do Cloud Run.

    Acessar a página Cloud Run functions

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

    • Princípios básicos:
      • Ambiente: neste exemplo, selecione 2nd gen, que é o padrão.
      • Nome da função: para este exemplo, nomeamos a função fsbackup.
      • Região: neste exemplo, selecione us-central1.
    • Gatilho:
      • Tipo de acionador: selecione HTTPS no menu.
      • Autenticação: selecione Require authentication.
    • Configurações de ambiente de execução, build, conexões e segurança:
      • Ambiente de execução > Conta de serviço do ambiente de execução > Conta de serviço: selecione Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) no menu.
      • Conexões > Configurações de entrada: selecione Allow all traffic.
  3. Clique em Próxima e continue a configuração da seguinte maneira:

    • Ambiente de execução: selecione Python 3.8 ou uma versão mais recente totalmente compatível com o Cloud Run functions no menu.
    • Código-fonte: Inline editor.
    • Ponto de entrada: insira create_backup.
    • Adicione as seguintes dependências ao arquivo requirements.txt:

      google-auth==2.29.0
      requests==2.31.0
      

      Dependendo do caso de uso, talvez seja necessário especificar outras dependências com os números de versão correspondentes. Para mais informações, consulte Pacotes pré-instalados.

    • Copie o exemplo de código Python abaixo no arquivo main.py usando o editor inline:

      Criar backup

      1. Este exemplo de código cria um backup chamado mybackup- anexado ao horário de criação.
      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_LOCATION = 'fs-location'
      SOURCE_INSTANCE_NAME = 'instance-id'
      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/v1/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_LOCATION, 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'])
          return "Backup creation has begun!"
      

      Substitua:

      • project-id pelo ID do projeto do Google Cloud da instância de origem do Filestore.
      • fs-location é a zona ou região da instância de origem do Filestore.
      • instance-id 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.
      1. Clique em Testar função.

        Uma nova sessão de guia é aberta no Cloud Shell. Nele, a seguinte mensagem será retornada se for bem-sucedida:

        Function is ready to test.
        
      2. Clique em Implantar e aguarde a conclusão da implantação.

      3. Volte para a guia anterior do Cloud Shell.

      Excluir um backup

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

      Só é possível excluir um backup por instância de origem por vez. Para mais informações, consulte Backups.

      Configure essa função da mesma forma que a função usada para criar um backup, usando as seguintes modificações:

      • Nome da função: deletefsbackup.
      • 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)
      
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          now = time.time()
          backup_list = []
          trigger_run_url = "https://file.googleapis.com/v1/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.")
              return "No backups to delete."
          else:
              backup_list.extend(data['backups'])
              while "nextPageToken" in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  backup_list.extend(data['backups'])
          for i in backup_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")))
              i['backup_timestamp'] = backup_time
          sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp'])
          oldest_backup = sorted_backup_list[0]
          if now - oldest_backup['backup_timestamp'] > retention_seconds:
              print(oldest_backup['name'] + " is older than the indicated retention time.")
              r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name']))
              data = r.json()
              print(data)
              if r.status_code == requests.codes.ok:
                  print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.")
              else:
                  raise RuntimeError(data['error'])
              return "Backup deletion has begun!"
          return "All backups are within the indicated retention period."
      

      Substitua:

      • project-id pelo ID do projeto do Google Cloud do backup.
      • region pela região em que o backup está armazenado. O backup, o job do agendador e a função precisam estar no mesmo local.
      • 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 impersonifique 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 das funções do Cloud Run 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 que você quer usar. Execute o comando functions add-iam-policy-binding abaixo:

    Criar backup

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

    Uma mensagem aparece indicando que o papel roles/run.invoker precisa ser concedido no serviço do Cloud Run e que você pode executar o comando gcloud functions add-invoker-policy-binding para aplicá-lo. Quando solicitado, digite Y.

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

    Excluir um backup

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

    Uma mensagem aparece indicando que o papel roles/run.invoker precisa ser concedido no serviço do Cloud Run e que você pode executar o comando gcloud functions add-invoker-policy-binding para aplicá-lo. Quando solicitado, digite Y.

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

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

Criar backup

  1. No nosso exemplo para este tutorial, se você quiser programar um backup todos os dias da semana às 22h, use o comando scheduler jobs create http:

    gcloud 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 flag --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.

    É possível criar no máximo seis backups por instância por hora.

  2. Inicie o job do Cloud Scheduler criado na etapa anterior. No nosso exemplo, use o comando scheduler jobs runs para executá-lo imediatamente:

    gcloud scheduler jobs run fsbackupschedule
    

    O job fsbackupschedule invoca a função fsbackup imediatamente após a execução do comando e, em seguida, invoca-a novamente a cada dia da semana às 22h até que o job seja pausado.

  3. Verifique os registros da função fsbackup para saber se ela é executada corretamente e retorna um status 200.

    Para conferir seus registros no console do Google Cloud, use o Explorador de registros:

    1. No console do Google Cloud, acesse a página Análise de registros:

      Acessar a Análise de registros

      Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Geração de registros.

      Os registros mais recentes são exibidos no painel Resultados da consulta.

  4. Verifique o status dos backups atuais usando o comando backups list:

    gcloud 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
    

Excluir um backup

  1. No nosso exemplo para este tutorial, se você quiser programar uma operação para excluir um backup todos os dias da semana às 22h, use o comando scheduler jobs create http:

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

    A flag --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.

    As operações de backup delete associadas à mesma instância de origem precisam ocorrer uma por vez. Para mais informações, consulte Backups.

  2. Inicie o job do Cloud Scheduler criado na etapa anterior. No nosso exemplo, usamos o comando scheduler jobs runs para executá-lo imediatamente:

    gcloud scheduler jobs run deletefsbackupschedule
    

    O job deletefsbackupschedule invoca a função deletefsbackup imediatamente após a execução do comando e, em seguida, invoca-a novamente a cada dia da semana às 22h até que o job seja pausado.

  3. Verifique os registros da função deletefsbackup para saber se ela é executada corretamente e retorna um status 200.

    Para conferir seus registros no console do Google Cloud, use o Explorador de registros:

    1. No console do Google Cloud, acesse a página Análise de registros:

      Acessar a Análise de registros

      Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Geração de registros.

      Os registros mais recentes são exibidos no painel Resultados da consulta.

  4. Verifique o status dos backups atuais usando o comando backups list:

    gcloud 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.

Exclua o projeto

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

Para excluir o projeto:

  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.

A seguir