Como programar backups


Neste tutorial, mostramos como programar backups para o Filestore instâncias usando as 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.
  • Criar uma conta de serviço do cliente para as funções do Cloud Run com o 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.
  • Criar um job do Cloud Scheduler que execute qualquer função regularmente em intervalos de tempo real.

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. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  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. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  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, caso ainda não tenha 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. Criar uma conta de serviço do cliente que o Cloud Run execute para chamar 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 iam service-accounts list comando:

    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 o cliente contas de serviço 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 pelo ID da instância do Filestore de origem instância.
    • 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 de 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 Next 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 as funções do Cloud Run 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 a seguir no arquivo main.py usando o editor in-line:

      Criar backup

      1. Este exemplo de código cria um backup chamado mybackup- anexado com o horário da 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 pela zona ou região da origem instância do Filestore.
      • instance-id pelo nome da origem. instância 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 guia será aberta no Cloud Shell. Nele, o seguinte 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 crie um backup com 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 da backup.
      • region pela região em que o backup reside. O backup, trabalho do programador e função devem residir na mesma o 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 à conta de serviço do cliente das funções do Cloud Run a roles/file.editor para que ele possa fazer 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 solicitação será mostrada, indicando que o papel roles/run.invoker precisam ser concedidas no serviço subjacente do Cloud Run e que você execute o comando gcloud functions add-invoker-policy-binding para aplicar reimplantá-lo. Quando uma resposta for solicitada, 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 solicitação será mostrada, indicando que o papel roles/run.invoker precisam ser concedidas no serviço subjacente do Cloud Run e que você execute o comando gcloud functions add-invoker-policy-binding para aplicar reimplantá-lo. Quando uma resposta for solicitada, 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 exemplo deste tutorial, se você quiser agendar um backup todos os dias da semana às 22h, use scheduler jobs create http comando:

    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. Em nosso exemplo, use o método 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 ver 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. Verificar o status dos backups atuais usando o backups list comando:

    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 ver 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