GCP Nuke est un petit utilitaire permettant de nettoyer vos projets Google Cloud. Ce client Go, sous licence MIT, supprime toutes les ressources de votre projet, ou vous permet d'en restreindre la suppression à l'aide de filtres.
Comme son nom l'indique, il peut s'avérer très destructeur !
Des équivalents existent pour AWS et Azure, proposés par le même auteur.
Il est particulièrement intéressant, par exemple, si vous avez un projet Sandbox que vous souhaitez nettoyer régulièrement, afin de réduire à la fois les coûts financiers et énergétiques.
Je vais vous montrer concrètement comment l'utiliser dans ce contexte.
Utilisation basique pour une Sandbox
Vous pouvez l’installer très simplement avec Homebrew :
brew install ekristen/tap/gcp-nuke
Assurez-vous d’avoir tous ces services activés :
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable storage.googleapis.com
gcloud services enable run.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
gcloud services enable pubsub.googleapis.com
gcloud services enable iam.googleapis.com
# pour vérifier que tout est correct :
gcloud services list --enabled
Vous pourrez personnaliser le comportement de l'outil grâce à un fichier de configuration.
Voici la liste des ressources disponibles gérées par l'outil.
Pour cet exemple, j'ai sélectionné les ressources suivantes :
- Cloud Functions
- CloudRun
- GKE
- Compute Instances & disks
- Storage Buckets
- BigQuery Datasets
- CloudSQL instances
Les régions à parser sont précisées au début du fichier.
Il est également possible d’épargner certaines ressources grâce à l’usage des tags, ces deux-là par exemple :
- managed_by: terraform
- gcp-nuke: ignore
regions:
- global
- us-east1 # US: South Carolina
- europe-west1 # EU: Belgium
- europe-west9 # EU: Paris
accounts:
my-gcp-project:
includes:
- CloudFunction
- CloudFunction2
- CloudRun
- GKECluster
- ComputeInstance
- ComputeFirewall
- ComputeForwardingRule
- ComputeSSLCertificate
- ComputeDisk
- StorageBucket
- BigQueryDataset
- CloudSQLInstance
filters:
__global__:
- property: label:gcp-nuke
value: "ignore"
- property: label:managed_by
value: "terraform"
ComputeFirewall:
- property: "name"
value: "default-*"
invert: true
Pour vous authentifier, vous pouvez utiliser un Service Account et déclarer la clé comme suit :
export GOOGLE_APPLICATION_CREDENTIALS=creds.json
Vous pouvez exécuter un "dry-run" pour voir ce qui sera détruit
(le dry-run permet une simulation avant exécution réelle, il est défini par défaut pour limiter les risques) :
gcp-nuke run --config config.yml --no-prompt --project-id <current-gcp-project-id>
Lorsque vous serez sûr de vous, vous pourrez lancer le “nuke” 💥 :
gcp-nuke run --config config.yml --no-prompt --no-dry-run --project-id <current-gcp-project-id>
Automatisation
Si vous le souhaitez, vous pouvez définir une tâche régulière qui libérera les ressources, par exemple une fois par jour à 2 heures du matin.
Cela peut être réalisé avec un Cloud Run Job.
Voici le Dockerfile :
FROM docker.io/library/golang:1.23 AS builder
# Install gcp-nuke
RUN go install github.com/ekristen/gcp-nuke@latest
FROM docker.io/library/debian:bookworm-slim
# Install ca-certificates for HTTPS requests and gcloud CLI
RUN apt-get update && \\
apt-get install -y ca-certificates curl gnupg && \\
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] <https://packages.cloud.google.com/apt> cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \\
curl <https://packages.cloud.google.com/apt/doc/apt-key.gpg> | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \\
apt-get update && \\
apt-get install -y google-cloud-cli && \\
rm -rf /var/lib/apt/lists/*
COPY --from=builder /go/bin/gcp-nuke /usr/local/bin/gcp-nuke
WORKDIR /app
COPY config.yml .
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
CMD ["./entrypoint.sh"]
Vous aurez également besoin d'un script EntryPoint pour gérer l'authentification à l'aide du Service Account associé au Cloud Run Job :
#!/bin/bash
set -e
echo "Authenticating with service account..."
gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS}
echo "Setting project..."
gcloud config set project ${PROJECT_ID}
echo "Running gcp-nuke..."
gcp-nuke run --config config.yml --no-prompt --no-dry-run --project-id ${PROJECT_ID}
Envoyez-le sur l’Artifact Registry :
gcloud artifacts repositories create gcp-nuke-repo \\
--repository-format=docker \\
--location=europe-west9 \\
--description="Docker Repo for gcp-nuke"
podman build -t europe-west9-docker.pkg.dev/<your-project-id>/gcp-nuke-repo/gcp-nuke-job:latest .
gcloud auth configure-docker europe-west9-docker.pkg.dev
podman push europe-west9-docker.pkg.dev/<your-project-id>/gcp-nuke-repo/gcp-nuke-job:latest
Voici le fichier Terraform pour le déploiement, qui créera le Cloud Run Job, le Service Account et le Cloud Scheduler :
# ----------------------------
# Cloud Run Job
# ----------------------------
resource "google_cloud_run_v2_job" "gcp_nuke_job" {
name = "gcp-nuke-job"
location = var.region
deletion_protection = false
template {
template {
service_account = google_service_account.gcp_nuke.email
containers {
image = "${var.region}-docker.pkg.dev/${var.project_id}/gcp-nuke-repo/gcp-nuke-job:latest"
env {
name = "PROJECT_ID"
value = var.project_id
}
# Cloud Run automatically provides service account credentials
env {
name = "GOOGLE_APPLICATION_CREDENTIALS"
value = "/var/secrets/google/key.json"
}
resources {
limits = {
cpu = "1"
memory = "512Mi"
}
}
# Mount the service account key
volume_mounts {
name = "service-account-key"
mount_path = "/var/secrets/google"
}
}
# Volume for service account key
volumes {
name = "service-account-key"
secret {
secret_name = google_secret_manager_secret_version.gcp_nuke_sa_key.secret
items {
key = "latest"
path = "key.json"
}
}
}
max_retries = 3
timeout = "300s"
}
parallelism = 1
labels = {
managed_by = "terraform"
}
}
}
# ----------------------------
# Service account and key
# ----------------------------
resource "google_service_account" "gcp_nuke" {
account_id = "sa-gcp-nuke"
display_name = "Service Account for gcp-nuke"
}
resource "google_service_account_key" "gcp_nuke_key" {
service_account_id = google_service_account.gcp_nuke.name
}
resource "google_project_iam_member" "gcp_nuke_owner" {
project = var.project_id
role = "roles/owner"
member = "serviceAccount:${google_service_account.gcp_nuke.email}"
}
# ----------------------------
# Secret Manager for SA key
# ----------------------------
resource "google_secret_manager_secret" "gcp_nuke_sa_key" {
secret_id = "gcp-nuke-sa-key"
replication {
auto {}
}
}
resource "google_secret_manager_secret_version" "gcp_nuke_sa_key" {
secret = google_secret_manager_secret.gcp_nuke_sa_key.id
secret_data = base64decode(google_service_account_key.gcp_nuke_key.private_key)
}
# Grant Cloud Run access to the secret
resource "google_secret_manager_secret_iam_member" "gcp_nuke_secret_access" {
secret_id = google_secret_manager_secret.gcp_nuke_sa_key.secret_id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:${google_service_account.gcp_nuke.email}"
}
# ----------------------------
# Cloud Scheduler
# ----------------------------
resource "google_cloud_scheduler_job" "gcp_nuke_schedule" {
name = "gcp-nuke-schedule"
description = "Run gcp-nuke every day at 2am"
schedule = "0 2 * * *"
time_zone = "Europe/Paris"
http_target {
http_method = "POST"
uri = "<https://$>{var.region}-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/${var.project_id}/jobs/${google_cloud_run_v2_job.gcp_nuke_job.name}:run"
oauth_token {
service_account_email = google_service_account.gcp_nuke.email
}
}
}
N'oubliez pas d'activer le Secret Manager API :
gcloud services enable secretmanager.googleapis.com
GCP-Nuke est un outil pratique pour nettoyer un projet GCP : vous disposez désormais des clés pour l'utiliser localement ou pour l'automatiser.
Cette solution est particulièrement adaptée pour nettoyer régulièrement un projet Sandbox, car elle réduit les coûts financiers et l'empreinte énergétique, respectant ainsi l’un des principes fondamentaux du Cloud, de construire uniquement ce que vous consommez réellement.