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:

  1. Cloud Scheduler dispara uma chamada HTTP diária (ou no horário que quiser).
  2. Essa chamada ativa uma Cloud Function (ou Cloud Run).
  3. A função usa a API do Cloud SQL Admin para exportar o banco para um bucket GCS.
  4. O arquivo .sql.gz fica 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


🔥 Bônus: Recomendações de Segurança


📌 O ideal é gerar um Terraform disso