01 - Configurando exportação de dados automática do Cloudsql
A Google Cloud SQL NÃO possui exportação automática nativa, apenas backups automáticos.
Mas nós conseguimos automatizar exports/dumps usando Cloud Scheduler + Cloud Functions (ou Cloud Run) → executando o comando de exportação do Cloud SQL.
Esse é o método mais usado em produção para ter uma segunda camada de backup fora da instância, em formato .sql ou .gz, dentro de um bucket GCS.
Abaixo te mostro o passo a passo completo e funcional.
✅ Arquitetura da Exportação Automática
Fluxo:
- Cloud Scheduler dispara uma chamada HTTP diária (ou no horário que quiser).
- Essa chamada ativa uma Cloud Function (ou Cloud Run).
- A função usa a API do Cloud SQL Admin para exportar o banco para um bucket GCS.
- O arquivo
.sql.gzfica armazenado no bucket — podendo ter retenção de 30, 60, 90 dias.
✅ Passo a passo completo
1️⃣ Criar o Bucket no GCS
gsutil mb -p SEU_PROJETO -l us-central1 gs://backups-mysql-producao/
Recomendo ativar Lifecycle (expiração automática):
Exemplo de regra para apagar arquivos com mais de 60 dias:
{
"rule": [
{
"action": {"type": "Delete"},
"condition": {"age": 60}
}
]
}
2️⃣ Criar a Service Account com permissão
Crie a service account:
gcloud iam service-accounts create cloudsql-backup \
--display-name="Cloud SQL Automated Backup"
Dê as permissões necessárias:
gcloud projects add-iam-policy-binding SEU_PROJETO \
--member="serviceAccount:cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com" \
--role="roles/cloudsql.admin"
gcloud projects add-iam-policy-binding SEU_PROJETO \
--member="serviceAccount:cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com" \
--role="roles/storage.admin"
3️⃣ Criar a Cloud Function (Node, Python ou Go)
Vou te passar a versão em Go, já que você trabalha com Golang.
✔ Código da Cloud Function em Go (HTTP Trigger)
Arquivo: main.go
package backup
import (
"context"
"fmt"
"log"
"net/http"
"time"
"google.golang.org/api/cloudsqladmin/v1beta4"
)
func ExportBackup(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()
project := "SEU_PROJETO"
instance := "db-mysql-producao-v8"
bucket := "gs://backups-mysql-producao"
now := time.Now().Format("2006-01-02-150405")
file := fmt.Sprintf("%s/backup-%s.sql.gz", bucket, now)
sqlService, err := cloudsqladmin.NewService(ctx)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
req := &cloudsqladmin.SqlInstancesExportRequest{
ExportContext: &cloudsqladmin.ExportContext{
Kind: "sql#exportContext",
FileType: "SQL",
Uri: file,
SqlExportOptions: &cloudsqladmin.ExportContextSqlExportOptions{
Compression: "GZIP",
},
},
}
op, err := sqlService.Instances.Export(project, instance, req).Context(ctx).Do()
if err != nil {
log.Println("Erro ao iniciar exportação:", err)
http.Error(w, "Erro ao iniciar exportação", 500)
return
}
fmt.Fprintf(w, "Exportação iniciada com sucesso! Operação: %s", op.Name)
}
4️⃣ Deploy da Cloud Function
gcloud functions deploy sql-export \
--runtime go122 \
--trigger-http \
--entry-point ExportBackup \
--service-account cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com \
--region us-central1 \
--allow-unauthenticated=false
5️⃣ Criar o Cloud Scheduler
gcloud scheduler jobs create http export-sql-daily \
--schedule="0 02 * * *" \
--uri="https://REGION-PROJECT.cloudfunctions.net/sql-export" \
--http-method=GET \
--oidc-service-account-email=cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com
Esse cron acima roda todos os dias às 02h da manhã.
6️⃣ Pronto! Exportação automática ativada
- O Cloud Scheduler chama a Function
- A Function chama a API Cloud SQL Admin
- O Cloud SQL exporta para o GCS
- O bucket faz retenção automática
- Você ganha uma camada extra de restore 100% independente da instância
🔥 Bônus: Recomendações de Segurança
- Ativar dual-region bucket (tipo
us→ altíssima durabilidade) - Deixar a Function inacessível publicamente (
--allow-unauthenticated=false) - Criptografar os dumps com CMEK
- Configurar Object Versioning se quiser histórico infinito
📌 O ideal é gerar um Terraform disso
- Bucket (com lifecycle)
- IAM
- Cloud Function em Go
- Cloud Scheduler
- Variáveis para nome da instância
- Saída com a URL final