Neste tutorial, mostramos como programar backups para instâncias do Filestore usando 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.
- 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 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.
- Crie um job do Cloud Scheduler que execute qualquer função em intervalos regulares.
Custos
Neste documento, você 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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure 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.
- Install the Google Cloud CLI.
-
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.
-
Make sure 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 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
No console do Google Cloud, clique em Ativar o Cloud Shell, se ainda não tiver feito isso.
Crie uma conta de serviço do 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 create
para nomear a conta comoschedulerunner
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"
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
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 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 é 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-region
Substitua backup-region pelo armazenamento de dados em que você quer armazenar o backup.
Criar uma função que cria um backup
No console do Google Cloud, acesse a página das funções do Cloud Run.
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
.
- Ambiente: neste exemplo, selecione
- Gatilho:
- Tipo de acionador: selecione
HTTPS
no menu. - Autenticação: selecione
Require authentication
.
- Tipo de acionador: selecione
- 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
.
- Ambiente de execução > Conta de serviço do ambiente de execução > Conta de serviço: selecione
- Princípios básicos:
Clique em Próxima 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 o Cloud Run functions 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 abaixo no arquivo
main.py
usando o editor inline: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 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 é a zona ou região da instância de origem do Filestore.
- instance-id 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.
Clique em Testar função.
Uma nova sessão de guia é aberta no Cloud Shell. Nele, a seguinte mensagem será retornada se for bem-sucedida:
Function is ready to test.
Clique em Implantar 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 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 do backup.
- 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
.
- Este exemplo de código cria um backup chamado
- Ambiente de execução: selecione
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 impersonifique a 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.serviceAgent
Atribua 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.editor
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 comandofunctions add-iam-policy-binding
abaixo:Criar backup
gcloud functions add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
Uma mensagem aparece indicando que o papel
roles/run.invoker
precisa ser concedido no serviço do Cloud Run e que você pode executar o comandogcloud functions add-invoker-policy-binding
para aplicá-lo. Quando solicitado, digiteY
.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 mensagem aparece indicando que o papel
roles/run.invoker
precisa ser concedido no serviço do Cloud Run e que você pode executar o comandogcloud functions add-invoker-policy-binding
para aplicá-lo. Quando solicitado, digiteY
.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
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://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.
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çãofsbackup
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.Verifique os registros da função
fsbackup
para saber se ela é executada corretamente e retorna umstatus 200
.Para conferir 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 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
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/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.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çãodeletefsbackup
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.Verifique os registros da função
deletefsbackup
para saber se ela é executada corretamente e retorna umstatus 200
.Para conferir 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 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:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
A seguir
- Saiba mais sobre os snapshots do Filestore.
- Saiba mais sobre os backups do Filestore.
- Saiba como programar snapshots do Filestore Enterprise.