Como programar backups


Neste tutorial, mostramos como programar backups para instâncias do Filestore 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 Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.

    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 Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.

    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 tiver uma instância do Filestore no seu projeto, primeiro crie uma.

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

  1. Se você ainda não tiver feito isso, clique em Ativar o Cloud Shell no console do Google Cloud.

  2. 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 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"
    
  3. 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"
    

    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 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_LOCATION=fs-location
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    Substitua:

    • fs-location pela região ou 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:

    • Noções básicas:
      • Ambiente: para este exemplo, selecione 2nd gen, que é o padrão.
      • Nome da função: para este exemplo, nomeamos a função fsbackup.
      • Região: para este exemplo, selecione us-central1.
    • Acionador:
      • Tipo de gatilho: 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 posterior totalmente compatível com o Cloud Functions no menu.
    • Código-fonte: Inline editor.
    • Ponto de entrada: digite 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 seguinte exemplo de código Python no arquivo main.py usando o editor inline:

      Criar backups

      1. Este exemplo de código cria um backup chamado mybackup- anexado ao horário da 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/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_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'])
          return "Backup creation has begun!"
      

      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.
      1. Clique em Testar função.

        Uma nova sessão de guia é aberta no Cloud Shell. Nela, 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 backups

      Este exemplo de código exclui backups mais antigos que 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)
      
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          now = time.time()
          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.")
              return "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'])
          return "Backup deletion has begun!"
      

      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 represente 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 que você quer usar. Execute o seguinte comando functions add-iam-policy-binding:

    Criar backups

    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.

    Excluir backups

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

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

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

  1. No exemplo deste 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 sinalização --schedule é onde você especifica a frequência de execução do job 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 para executá-lo imediatamente:

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