02 - Deixando a function inacessível publicamente
Continuação do artigo 01 - Configurando exportação de dados automática do Cloudsql
Para deixar a Cloud Function inacessível publicamente, você precisa remover a permissão de invocação anônima e permitir somente chamadas autenticadas, normalmente via OIDC usando uma Service Account (como a usada pelo Cloud Scheduler).
A boa notícia: isso é simples.
✅ 1️⃣ Não usar --allow-unauthenticated no deploy
Se você já publicou assim:
gcloud functions deploy minha-func --allow-unauthenticated
Ela virou pública.
Para deixar privada, republique sem essa flag:
gcloud functions deploy sql-export \
--runtime go122 \
--trigger-http \
--entry-point ExportBackup \
--service-account cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com \
--region us-central1
Isso já deixa a função restrita automaticamente.
✅ 2️⃣ Remover a permissão allUsers manualmente (se já existia)
Execute:
gcloud functions remove-iam-policy-binding sql-export \
--region us-central1 \
--member="allUsers" \
--role="roles/cloudfunctions.invoker"
Isso remove totalmente o acesso público.
✅ 3️⃣ Dar permissão SOMENTE ao Cloud Scheduler
O Scheduler chama a Function usando OIDC.
Então ele precisa da permissão:
roles/cloudfunctions.invoker
Adicione:
gcloud functions add-iam-policy-binding sql-export \
--region us-central1 \
--member="serviceAccount:cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com" \
--role="roles/cloudfunctions.invoker"
❗ Importante sobre o Scheduler
Quando criar o Scheduler, use OIDC:
gcloud scheduler jobs create http export-sql-daily \
--schedule="0 02 * * *" \
--uri="https://us-central1-SEU_PROJETO.cloudfunctions.net/sql-export" \
--http-method=GET \
--oidc-service-account-email=cloudsql-backup@SEU_PROJETO.iam.gserviceaccount.com
Isso faz com que SOMENTE o Scheduler consiga chamar a function.
📌 Resultado final
-
Nenhum usuário consegue acessar a URL da function.
-
Se alguém acessar via navegador → 403 Forbidden.
-
Cloud Scheduler chama via OIDC usando Service Account → 200 OK.
🔐 Verificando se ficou realmente privada
Rodar:
curl https://us-central1-SEU_PROJETO.cloudfunctions.net/sql-export
Se estiver privada corretamente → retornará 403.