Agendar cópias de segurança


Este tutorial mostra como agendar cópias de segurança para instâncias do Filestore usando o Cloud Scheduler e as funções do Cloud Run.

Objetivos

  • Crie uma conta de serviço de cliente para o Cloud Scheduler que tenha as credenciais necessárias para invocar uma função do Cloud Run Functions.
  • Crie uma conta de serviço de cliente para as funções do Cloud Run que tenha as credenciais para chamar o ponto final do Filestore.
  • Crie uma função do Cloud Run que crie uma cópia de segurança de uma instância do Filestore.
  • Crie uma função do Cloud Run que elimine uma cópia de segurança de uma instância do Filestore.
  • Crie uma tarefa do Cloud Scheduler que execute qualquer uma das funções em intervalos regulares.

Custos

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.

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. Verify 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. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

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

    Go to project selector

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

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

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Se não tiver uma instância do Filestore no seu projeto, tem de criar uma primeiro.
  15. Crie contas de serviço de cliente para funções do Cloud Scheduler e do Cloud Run

    1. Se ainda não o fez, na Google Cloud consola, clique em Ativar Cloud Shell.

    2. Crie uma conta de serviço do cliente que o Cloud Scheduler execute para invocar uma função do Cloud Run. Para este exemplo, use o comando iam service-accounts create para dar o nome schedulerunner à conta e definir o nome a apresentar 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 que as funções do Cloud Run executem para chamar o ponto final do Filestore. Para este exemplo, vamos dar o nome backupagent à conta e definir o nome a apresentar como "Conta de serviço para cópias de segurança do FS-GCF":

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

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

      gcloud iam service-accounts list
      

      O comando devolve algo semelhante ao seguinte:

      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
      

    Configure variáveis de ambiente

    Configure as seguintes variáveis de ambiente no seu ambiente local:

    • Google Cloud ID do projeto e projeto:

      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 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
      
    • A sua instância do Filestore:

      export SOURCE_INSTANCE_LOCATION=fs-location
      export SOURCE_INSTANCE_NAME=instance-id
      export SHARE_NAME=file-share-name
      

      Substitua o seguinte:

      • fs-location com a zona ou a região onde a instância do Filestore de origem reside.
      • instance-id com o ID da instância da instância do Filestore de origem.
      • file-share-name com o nome que especificar para a partilha de ficheiros NFS que é servida a partir da instância.
    • Configure as variáveis de ambiente para a cópia de segurança do Filestore:

      export BACKUP_REGION=backup-region
      

      Substitua backup-region pela região onde quer armazenar a cópia de segurança.

    Crie uma função que crie uma cópia de segurança

    1. Na Google Cloud consola, aceda à página de funções do Cloud Run.

      Aceda à página de funções do Cloud Run

    2. Clique em Escrever uma função e configure a função da seguinte forma:

      • Configurar:
        • Nome do serviço: para este exemplo, vamos dar o nome fsbackup à função.
        • Região: para este exemplo, selecione us-central1.
        • Tempo de execução: selecione qualquer tempo de execução do Python 3 suportado totalmente suportado pelas funções do Cloud Run no menu.
      • Acionador:
        • Não é necessário definir o acionador para este exemplo.
      • Autenticação: selecione Require authentication.
      • Entrada: selecione All.
      • Contentores, volumes, rede, segurança
        • Aceda ao separador Segurança e selecione Service Account for FS Backups-GCF (backupagent@$PROJECT_ID.iam.gserviceaccount.com) no menu.
    3. Clique em Criar e continue a configuração da seguinte forma:

      • Ponto de entrada da função: introduza create_backup.
      • Adicione as seguintes dependências ao ficheiro requirements.txt:

        functions-framework==3.*
        google-auth==2.29.0
        requests==2.31.0
        

        Consoante o seu exemplo de utilização, pode ter de especificar outras dependências, juntamente com os respetivos números de versão. Para mais informações, consulte o artigo Pacotes pré-instalados.

      • Copie o seguinte exemplo de código Python para o ficheiro main.py através do editor inline:

        Criar uma cópia de segurança

        Este exemplo de código cria uma cópia de segurança com o nome mybackup- anexado à hora 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 functions_framework
        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")
        
        @functions_framework.http
        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 o seguinte:

        • project-id com o ID do projeto da instância do Filestore de origem. Google Cloud
        • fs-location com a zona ou a região da instância do Filestore de origem.
        • instance-id com o nome da instância do Filestore de origem.
        • file-share-name com o nome da partilha de ficheiros.
        • backup-region com a região onde quer armazenar a cópia de segurança.
        1. Clique em Testar

          É aberta uma nova sessão de separador no Cloud Shell. Nela, é devolvida a seguinte mensagem se for bem-sucedida:

          Backup creation has begun!
          
        2. Clique em Guardar e voltar a implementar e aguarde que a implementação termine.

        3. Volte ao separador anterior do Cloud Shell.

        Elimine uma cópia de segurança

        Este exemplo de código elimina as cópias de segurança mais antigas do que um período predefinido.

        Só pode eliminar uma cópia de segurança por instância de origem de cada vez. Para mais informações, consulte a secção Cópias de segurança.

        Configure esta função da mesma forma que a função que usou para criar uma cópia de segurança, 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 functions_framework
        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
        
        @functions_framework.http
        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 o seguinte:

        • project-id com o ID do projeto do backup. Google Cloud
        • region com a região onde reside a cópia de segurança. A cópia de segurança, a tarefa do programador e a função devem residir na mesma localização.
        • hours com o número de horas para reter as cópias de segurança. Por exemplo, se quiser reter cópias de segurança durante 10 dias, introduza 240.

    Atribua funções 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 a função de roles/cloudscheduler.serviceAgent. Isto permite que o agente de serviço se faça passar pela conta de serviço do cliente para invocar a função que cria uma cópia de segurança. 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 função roles/file.editor para que possa fazer chamadas para o ponto final 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 a função de roles/run.invoker para a função que quer usar. Execute o seguinte comando run services add-iam-policy-binding:

      Criar uma cópia de segurança

      gcloud run services add-iam-policy-binding fsbackup \
          --member serviceAccount:$SCHEDULER_CLIENT_SA \
          --role roles/run.invoker \
          --region=us-central1
      

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

      Elimine uma cópia de segurança

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

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

    Crie uma tarefa do Cloud Scheduler que acione a função num horário especificado

    Criar uma cópia de segurança

    1. No nosso exemplo para este tutorial, se quiser agendar uma cópia de segurança todos os dias da semana às 22:00, use o comando scheduler jobs create http:

      gcloud scheduler jobs create http fsbackupschedule \
          --schedule "0 22 * * 1-5" \
          --http-method=GET \
          --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \
          --oidc-service-account-email=$SCHEDULER_CLIENT_SA \
          --location=us-central1
      

      A flag --schedule é onde especifica a frequência com que a tarefa é executada usando a formatação unix-cron. Para ver detalhes, consulte o artigo Configurar agendamentos de tarefas cron.

      Pode criar um máximo de seis cópias de segurança por instância por hora.

    2. Inicie a tarefa do Cloud Scheduler criada no passo anterior. No nosso exemplo, use o comando scheduler jobs runs para o executar imediatamente:

      gcloud scheduler jobs run fsbackupschedule
      

      A tarefa fsbackupschedule invoca a função fsbackup imediatamente assim que executa o comando e, em seguida, invoca-a novamente todos os dias úteis às 22:00 até que a tarefa seja pausada.

    3. Verifique os registos da função fsbackup para ver se é executada corretamente e devolve um status 200.

      Para ver os registos na Google Cloud consola, use o Explorador de registos:

      1. Na Google Cloud consola, aceda à página Explorador de registos:

        Aceda ao Explorador de registos

        Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

        Os registos mais recentes são apresentados no painel Resultados da consulta.

    4. Verifique o estado das suas cópias de segurança existentes através do comando backups list:

      gcloud filestore backups list
      

      O comando devolve algo semelhante ao seguinte:

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

    Elimine uma cópia de segurança

    1. No nosso exemplo para este tutorial, se quisesse agendar uma operação para eliminar uma cópia de segurança todos os dias úteis às 22:00, usaria 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 especifica a frequência com que a tarefa é executada usando a formatação unix-cron. Para ver detalhes, consulte o artigo Configurar agendamentos de tarefas cron.

      As operações de delete cópia de segurança associadas à mesma instância de origem têm de ocorrer uma de cada vez. Para mais informações, consulte o artigo Cópias de segurança.

    2. Inicie a tarefa do Cloud Scheduler criada no passo anterior. No nosso exemplo, usamos o comando scheduler jobs runs para o executar imediatamente:

      gcloud scheduler jobs run deletefsbackupschedule
      

      A tarefa deletefsbackupschedule invoca a função deletefsbackup imediatamente assim que executa o comando e, em seguida, invoca-a novamente todos os dias úteis às 22:00 até que a tarefa seja pausada.

    3. Verifique os registos da função deletefsbackup para ver se é executada corretamente e devolve um status 200.

      Para ver os registos na Google Cloud consola, use o Explorador de registos:

      1. Na Google Cloud consola, aceda à página Explorador de registos:

        Aceda ao Explorador de registos

        Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

        Os registos mais recentes são apresentados no painel Resultados da consulta.

    4. Verifique o estado das suas cópias de segurança existentes através do comando backups list:

      gcloud filestore backups list
      

      O comando devolve algo semelhante ao seguinte:

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

    Alertas de quota baixa para cópias de segurança

    Se a sua implementação da programação de cópias de segurança colocar em risco a possibilidade de ficar sem quota de cópias de segurança, recomendamos que configure alertas de quota de cópias de segurança baixa. Desta forma, recebe uma notificação quando a quota de cópias de segurança estiver quase esgotada.

    Limpar

    Depois de concluir o tutorial, pode limpar os recursos que criou para que deixem de usar a quota e incorrer em custos. As secções seguintes descrevem como eliminar ou desativar estes recursos.

    Elimine o projeto

    A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.

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

    O que se segue?