Neste tutorial, mostramos como programar backups para instâncias do Filestore usando o Cloud Scheduler e o Cloud Functions.
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 Functions.
- Crie uma conta de serviço do cliente para uso pelo Cloud Functions com as credenciais para chamar o endpoint do Filestore.
- Criar uma função do Cloud Functions que cria (ou exclui) um backup de um compartilhamento de arquivos.
- Criar um job do Cloud Scheduler que execute a função de criação de backups (ou excluir backups) 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
- Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, 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.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative as APIs Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.
- Instale a CLI do Google Cloud.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative as APIs Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler.
- Instale a CLI do Google Cloud.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
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 o Cloud Scheduler e o Cloud Functions
Se você 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 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 do Backups- Scheduler do FS":gcloud iam service-accounts create schedulerunner \ --display-name="Service Account for FS Backups-Scheduler"
Crie uma conta de serviço de cliente em que o Cloud Functions seja executado 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"
Execute o comando
iam service-accounts list
para verificar se a conta de serviço foi criada: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 clientes do Cloud Scheduler e do Cloud 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.com
Sua instância do Filestore:
export FS_LOCATION=fs-location export INSTANCE_NAME=instance-id export SHARE_NAME=datafile-share-name
Substitua:
- fs-location pela região ou zona em que a instância do Filestore reside.
- instance-id é o ID de instância 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 FS_BACKUP_LOCATION=region
Substitua 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 do Cloud Functions.
Clique em Criar função e configure a função da seguinte maneira:
- Noções básicas:
- 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
- Noções básicas:
Clique em Next 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 Functions no menu. - Código-fonte:
Inline editor
. - Ponto de entrada: digite
create_backup
. Adicione as seguintes dependências ao arquivo
requirements.txt
:google-auth==2.29.0 requests==2.31.0
Dependendo do seu caso de uso, pode ser necessário especificar outras dependências e 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 backups
- Este exemplo de código cria um backup chamado
mybackup-
, anexado com o horário de criação.
PROJECT_ID = 'project-id' SOURCE_INSTANCE_ZONE = 'filestore-zone' SOURCE_INSTANCE_NAME = 'filestore-name' 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_ZONE, 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.
- filestore-zone é a zona da instância de do Filestore origem.
- filestore-name 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 guia será 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 backups
Este exemplo de código exclui backups anteriores a um período predefinido.
Configure essa função da mesma forma que a função de criação de backups, exceto a seguinte:
- Nome da função:
deletefsbackups
. - 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() list = [] trigger_run_url = "https://file.googleapis.com/v1beta1/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: list.extend(data['backups']) while 'nextPageToken' in data.keys(): nextPageToken = data['nextPageToken'] trigger_run_url_next = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken) r = authed_session.get(trigger_run_url_next) data = r.json() list.extend(data['backups']) for i in 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"))) if now - backup_time > retention_seconds: print("Deleting " + i['name'] + " in the background.") r = authed_session.delete("https://file.googleapis.com/v1beta1/{}".format(i['name'])) data = r.json() print(data) if r.status_code == requests.codes.ok: print(str(r.status_code) + ": Deleting " + i['name'] + " in the background.") else: raise RuntimeError(data['error']) return "Backup deletion has begun!"
Substitua:
- project-id pelo ID do projeto do Google Cloud do backup.
- region pela região em que os backups estão armazenados.
- 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
. Assim, o agente de serviço pode representar 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 do Cloud Functions 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
a seguir:Criar backups
gcloud functions add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
Agora, apenas a conta de serviço do cliente do Cloud Scheduler pode invocar
fsbackup
.Excluir backups
gcloud functions add-iam-policy-binding deletefsbackups \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
Agora, apenas a conta de serviço do cliente do Cloud Scheduler pode invocar
deletefsbackups
.
Criar um job do Cloud Scheduler que aciona a função fsbackup
em uma programação especificada
No exemplo deste 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 sinalização
--schedule
é onde você especifica a frequência em que o job é executado usando a formatação unix-cron. Para detalhes, consulte Como configurar programações de cron job.Inicie o job do Cloud Scheduler criado na etapa anterior. Em nosso exemplo, use o comando
scheduler jobs runs
para executá-lo imediatamente:gcloud scheduler jobs run fsbackupschedule
O job
fsbackupschedule
invoca a funçãofsbackups
imediatamente depois que você executa o comando e, em seguida, a invoca novamente toda semana às 22h até que o job seja pausado.Verifique os registros da função
fsbackups
para ver se a função é executada corretamente e retorna umstatus 200
.Verifique se o backup foi criado 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:
- No Console do 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 backups do Filestore.
- Saiba como programar snapshots do Filestore Enterprise.