Neste tutorial, mostramos como programar backups para instâncias de Filestore de nível HDD básico e SSD básico, 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:
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 Cloud Scheduler, Cloud Functions, and Filestore.
- 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 Cloud Scheduler, Cloud Functions, and Filestore.
- Instale a CLI do Google Cloud.
-
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 o Cloud Functions
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 conta comoschedulerunner
e definir o nome de exibição como "Service Account for 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 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"
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
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 o Cloud Scheduler e o 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_ZONE=zone export INSTANCE_NAME=instance-id export SHARE_NAME=datafile-share-name
Substitua:
- zone é a 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:
- Conceitos básicos:
- Nome da função: para este exemplo, nomeamos a função
fsbackup
. - Região: neste exemplo, usamos
us-central1
.
- Nome da função: para este exemplo, nomeamos a função
- Acionador:
- Tipo de acionador:
HTTP
. - Autenticação:
Require authentication
.
- Tipo de acionador:
- Configurações de ambiente de execução, criação e conexão:
- Conta de serviço do ambiente de execução:
Service Account for FS Backups-GCF
(backupagent@$PROJECT_ID.iam.gserviceaccount.com
). - Configurações de entrada:
Allow all traffic
.
- Conta de serviço do ambiente de execução:
- Código-fonte:
Inline editor
. - runtime:
Python 3.7
. - Ponto de entrada:
create_backup
. Em
requirements.txt
, adicione as seguintes dependências:google-auth==1.19.2 requests==2.24.0
Copie o seguinte exemplo de código Python no editor in-line
main.py
:Criar backups
Este exemplo de código cria um backup chamado
mybackup-
anexado ao 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/v1beta1/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'])
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.
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) now = time.time() retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60 def delete_backup(request): 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.") 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'])
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
.
- Conceitos básicos:
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 representa 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çãofsbackup
. Execute o seguinte comandofunctions add-iam-policy-binding
: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
.
Criar um job do Cloud Scheduler que aciona a função fsbackup
em uma programação especificada
No exemplo deste tutorial, se você quisesse programar um backup todos os dias úteis às 22h, usaria o comando
scheduler jobs create http
:gcloud beta 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 com 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. No nosso exemplo, use o comando
scheduler jobs runs
:gcloud scheduler jobs run fsbackupschedule
O job
fsbackupschedule
invoca a função "fsbackups" imediatamente 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
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 beta 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.
Excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir o projeto, faça o seguinte:
- 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 empresarial.