Neste tutorial, mostramos como programar backups para instâncias do Filestore usando o Cloud Scheduler e as funções 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.
- 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
- 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.
-
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.
-
Install the Google Cloud CLI.
-
Se você estiver usando um provedor de identidade externo (IdP), 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.
-
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.
-
Install the Google Cloud CLI.
-
Se você estiver usando um provedor de identidade externo (IdP), 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.
Se ainda não tiver feito isso, no console 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 create
para nomear a contaschedulerunner
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"
Verifique se a conta de serviço foi criada executando 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
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.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 com 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.
No console 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.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 a seguir no arquivo
main.py
usando o editor in-line:Criar backup
Esta 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 o procedimento for bem-sucedido:
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
Esta 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
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.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/run.invoker
para 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-central1
Agora, 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.invoker
Agora, apenas a conta de serviço do cliente do Cloud Scheduler pode invocar
deletefsbackup
.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-central1
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 executar 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 todos os dias úteis às 22h até que o job seja pausado.Verifique os registros da função
fsbackup
para ver se ela é executada corretamente e retorna umstatus 200
.Para ver seus registros no console Google Cloud , use o Explorador de registros:
-
No console 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 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
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 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 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 todos os dias da semana às 22h até que o job seja pausado.Verifique os registros da função
deletefsbackup
para ver se ela é executada corretamente e retorna umstatus 200
.Para ver seus registros no console Google Cloud , use o Explorador de registros:
-
No console 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 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
- 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.
- Saiba mais sobre os snapshots do Filestore.
- Saiba mais sobre os backups do Filestore.
- Saiba como programar snapshots do Filestore Enterprise.
Criar contas de serviço do cliente para o Cloud Scheduler e as funções do Cloud Run
Configurar variáveis de ambiente
Configure as seguintes variáveis no seu ambiente local:
Criar uma função que cria um backup
Atribuir papéis do IAM às contas de serviço do cliente
Criar um job do Cloud Scheduler que aciona a função em uma programação especificada
Criar backup
Excluir um backup
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: