Neste tutorial, mostramos como programar backups para instâncias do Filestore usando o Cloud Scheduler e as funções do Cloud Run.
Para informações sobre como criar backups usando um programador de serviço gerenciado, consulte Backups aprimorados do Filestore.
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.
- 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 das funções do Cloud Run que cria um backup de uma instância do Filestore.
- Criar uma função das funções do Cloud Run que exclui um backup de uma instância do Filestore.
- Crie um job do Cloud Scheduler que execute qualquer uma das funções em intervalos regulares.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
- Artifact Registry API
- Cloud Build API
- Filestore API
- Cloud Functions API
- Cloud Logging API
- Pub/Sub API
- Cloud Run Admin API
- Cloud Scheduler API
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Antes de começar
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init - 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 as funções do Cloud Run
Se ainda não tiver feito isso, no console do Google Cloud , clique em Ativar o Cloud Shell.
Crie uma conta de serviço de cliente em que o Cloud Scheduler seja executado para invocar uma função do Cloud Run functions. Neste exemplo, use o comando
iam service-accounts createpara nomear a contaschedulerunnere 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"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
backupagente 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 listO 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:
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 do cliente para o Cloud Scheduler e as funções 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.comSua instância do Filestore:
export SOURCE_INSTANCE_LOCATION=fs-location export SOURCE_INSTANCE_NAME=instance-id export SHARE_NAME=file-share-nameSubstitua:
- fs-location com a zona ou região em que a instância de origem do Filestore está localizada.
- 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-regionSubstitua backup-region pela região em que você quer armazenar o backup.
Criar uma função que cria um backup
No console do Google Cloud , acesse a página de funções do Cloud Run.
Clique em Escrever uma função e configure a função da seguinte maneira:
- Configurar:
- Nome do serviço: para este exemplo, nomeamos a função
fsbackup. - Região: neste exemplo, selecione
us-central1. - Ambiente de execução: selecione qualquer ambiente de execução do Python 3 compatível totalmente compatível com as funções do Cloud Run no menu.
- Nome do serviço: para este exemplo, nomeamos a função
- Gatilho:
- Não é necessário definir um gatilho para este exemplo.
- Autenticação: selecione
Require authentication. - Entrada: selecione
All. - Contêineres, volumes, rede, segurança
- Acesse a guia Segurança e selecione
Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.iam.gserviceaccount.com) no menu.
- Acesse a guia Segurança e selecione
- Configurar:
Clique em Criar e continue a configuração da seguinte maneira:
- Ponto de entrada da função: insira
create_backup. Adicione as seguintes dependências ao arquivo
requirements.txt:functions-framework==3.* google-auth==2.29.0 requests==2.31.0Dependendo 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.pyusando o editor in-line:Criar backup
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 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:
- project-id com o ID do projeto 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 com o 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.
Clique em Testar.
Uma nova sessão de guia é aberta no Cloud Shell. Nele, a seguinte mensagem será retornada se a operação for bem-sucedida:
Backup creation has begun!Clique em Salvar e reimplantar e aguarde a conclusão da implantação.
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 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:
- project-id com o ID do projeto do backup. Google Cloud
- 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.
- Ponto de entrada da função: insira
Atribuir papéis do IAM às contas de serviço do cliente
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 use uma identidade temporária da conta de serviço do cliente para invocar a função que cria um backup. Execute o comandoiam service-accounts add-iam-policy-binding:gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \ --member=serviceAccount:$SCHEDULER_SA \ --role=roles/cloudscheduler.serviceAgentAtribua 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 comandoprojects add-iam-policy-binding:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:$GCF_CLIENT_SA \ --role=roles/file.editorConceda à conta de serviço do Cloud Scheduler o papel de
roles/run.invokerpara a função que você quer usar. Execute o comandorun services add-iam-policy-binding:Criar backup
gcloud run services add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invoker \ --region=us-central1Agora, apenas a conta de serviço do cliente do Cloud Scheduler pode invocar
fsbackup.Excluir um backup
gcloud run services add-iam-policy-binding deletefsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invokerAgora, 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
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://fsbackup-$PROJECT_NUMBER.us-central1.run.app \ --oidc-service-account-email=$SCHEDULER_CLIENT_SA \ --location=us-central1A 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.
Inicie o job do Cloud Scheduler criado na etapa anterior. No nosso exemplo, use o comando
scheduler jobs runspara executar imediatamente:gcloud scheduler jobs run fsbackupscheduleO job
fsbackupscheduleinvoca a funçãofsbackupimediatamente após a execução do comando e, em seguida, invoca-a novamente todos os dias úteis às 22h até que o job seja pausado.Verifique os registros da função
fsbackuppara ver se ela é executada corretamente e retorna umstatus 200.Para ver seus registros no console do Google Cloud , use a Análise de registros:
-
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.
-
Verifique o status dos seus backups atuais usando o comando
backups list:gcloud filestore backups listO 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
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/deletefsbackupA 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
deleteassociadas à mesma instância de origem precisam ocorrer uma de cada vez. Para mais informações, consulte Backups.Inicie o job do Cloud Scheduler criado na etapa anterior. No nosso exemplo, usamos o comando
scheduler jobs runspara executá-lo imediatamente:gcloud scheduler jobs run deletefsbackupscheduleO job
deletefsbackupscheduleinvoca a funçãodeletefsbackupimediatamente após a execução do comando e, em seguida, invoca-a novamente todos os dias da semana às 22h até que o job seja pausado.Verifique os registros da função
deletefsbackuppara ver se ela é executada corretamente e retorna umstatus 200.Para ver seus registros no console do Google Cloud , use a Análise de registros:
-
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.
-
Verifique o status dos seus backups atuais usando o comando
backups list:gcloud filestore backups listO 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:
- No console Google Cloud , acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
A seguir
- Saiba mais sobre os snapshots do Filestore.
- Saiba mais sobre os backups do Filestore.
- Saiba como programar snapshots do Filestore Enterprise.