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 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 de cliente para as funções do Cloud Run que tenha as credenciais para chamar o endpoint do Filestore.
- Crie uma função das funções do Cloud Run que crie um backup de uma instância do Filestore.
- Crie uma função das funções do Cloud Run que exclua 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 Cloudagora, crie uma conta para avaliar o desempenho dos 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, if any are not already enabled.
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.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
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, if any are not already enabled.
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.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init - Se você não tiver uma instância do Filestore no projeto, crie uma primeiro.
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 do cliente que o Cloud Scheduler execute para invocar uma função do Cloud Run functions. Para este exemplo, use o comando
iam service-accounts createpara nomear a conta comoschedulerunnere 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 que as funções do Cloud Run executam 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"Para verificar se a conta de serviço foi criada, execute 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 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 do cliente para o Cloud Scheduler e o Cloud Run 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.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 com o ID 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: neste exemplo, vamos chamar a função de
fsbackup. - Região: para este 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: neste exemplo, vamos chamar a função de
- 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 inline:Criar backup
Este exemplo de código cria um backup chamado
mybackup-anexado com o 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() auth_request = google.auth.transport.requests.Request() credentials.refresh(auth_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 com 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 backups mais antigos do que 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, 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() auth_request = google.auth.transport.requests.Request() credentials.refresh(auth_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 Google Cloud do backup.
- region com a região em que o backup está localizado. 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 manter os backups por 10 dias, insira
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 a função
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.serviceAgentConceda à conta de serviço do cliente das funções do Cloud Run o papel
roles/file.editorpara que ela possa fazer 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 seguinte 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 acione a função em uma programação especificada
Criar backup
No exemplo deste tutorial, se você quisesse programar um backup todos os dias da semana às 22h, usaria 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 executá-lo imediatamente:gcloud scheduler jobs run fsbackupscheduleO job
fsbackupscheduleinvoca a funçãofsbackupimediatamente depois que você executa o comando e a invoca novamente todos os dias da semana às 22h até que o job seja pausado.Verifique os registros da função
fsbackuppara saber se ela é executada corretamente e retorna umstatus 200.Para ver seus registros no console do Google Cloud , use o Explorador 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 exemplo deste tutorial, se você quisesse 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 por 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 depois a invoca novamente todos os dias úteis às 22h até que o job seja pausado.Verifique os registros da função
deletefsbackuppara saber 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 cota baixa 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 snapshots do Filestore.
- Saiba mais sobre os backups do Filestore.
- Saiba como programar snapshots do Filestore Enterprise.