Quando si progetta e si sviluppa una nuova infrastruttura su Google Cloud, si finisce per sperimentare con ogni tipo di risorsa. Il risultato è un progetto in disordine che, finché quelle risorse restano attive, continua a generare costi.
Le risorse si possono eliminare a mano, ma trovarle tutte tra i numerosi servizi di GCP — Compute, Containers, AppEngine, Cloud SQL e altri ancora — non è semplice.
Ho creato il progetto open-source Safe Scrub proprio per rendere questa operazione semplice e sicura!

La sicurezza prima di tutto
Safe Scrub è stato progettato per essere sicuro.
Safe Scrub non elimina le risorse: genera invece uno script in grado di farlo.
Uno script di eliminazione trasparente
Lo script di eliminazione è trasparente: trattandosi semplicemente di un elenco di istruzioni gcloud``delete, è facile capire che cosa farà alle tue risorse. Una volta generato, esamina ogni riga per vedere esattamente che cosa verrà eliminato, e solo allora eseguilo.
Questa è la funzione di sicurezza più importante, ma non è l'unica.
Account e progetto espliciti
Safe Scrub richiede un file di chiave JSON con le credenziali di un service account, anziché del tuo account utente connesso. È un modo per imporre la scelta consapevole di un ruolo: il service account dovrebbe averne uno privo di permessi di scrittura, come Project Viewer, dato che lo script di generazione non ne ha bisogno né li utilizza.
Inoltre, puoi assegnare un ruolo ancora più limitato se vuoi elencare solo risorse di determinati tipi. Eventuali errori sui permessi non sono un problema: se il ruolo è troppo restrittivo (e anche se un'API GCP non è ancora abilitata), Safe Scrub prosegue senza intoppi, semplicemente non riuscirà a elencare la risorsa non disponibile. Si limita a mostrare un messaggio di errore e tira dritto.
A differenza di gcloud, Safe Scrub richiede di indicare esplicitamente un progetto, per evitare di affidarsi a un progetto di default ed elencare per errore risorse che non si intendeva eliminare. Anche lo script di eliminazione generato indica il progetto in ogni comando, così che l'eliminazione non venga eseguita per sbaglio sul progetto di default attualmente in uso.
Filtri
Safe Scrub supporta due tipi di filtraggio.
Innanzitutto, c'è un'opzione da riga di comando che permette di selezionare solo le risorse desiderate. Si può filtrare per label, nome, data di creazione e molto altro, sfruttando tutta la potenza dei filtri di gcloud. (Per i bucket di Cloud Storage, dove si usa gsutil al posto di gcloud, sono supportati solo filtri di uguaglianza su una singola label (key=value1); altrimenti il filtro viene ignorato.)
In secondo luogo, Safe Scrub supporta un elenco di esclusioni in exclusions.txt. Le risorse che contengono una qualsiasi di queste stringhe nel proprio URI non verranno incluse nello script di eliminazione. Per usare questa funzione, esegui Safe Scrub, individua gli elementi che non dovranno essere eliminati in futuro e aggiungi l'URI corrispondente, o una sua porzione identificativa, a exclusions.txt. (Per Cloud Functions viene usato il nome anziché l'URI, a causa di un bug di gcloud.)
Per esempio, quando compaiono queste righe:
networks/default firewalls/default
le reti di default e anche i firewall di default (i cui URI hanno la forma https://www.googleapis.com/compute/v1/projects/my-project/global/firewalls/default-allow-https) non verranno eliminati.
Monitorare il processo di eliminazione
Quando esegui per la prima volta i tuoi script di eliminazione, vorrai seguire il processo in tempo reale. Safe Scrub antepone set -x allo script, in modo da fornire un output di debug.
Per agevolare il monitoraggio durante l'eliminazione, Safe Scrub genera un normale script sequenziale. Tuttavia, tramite l'opzione -b, puoi anche generare comandi in background (asincroni), così che l'eliminazione di più risorse avvenga in parallelo. È più veloce, ma più difficile da tenere sotto controllo, e rischia di sovraccaricare i sistemi con troppe chiamate concorrenti.
Passi successivi: rivedere ed eseguire
Quel primo passaggio si limita a fornirti uno script di eliminazione. Il passo successivo è esaminarlo e rimuovere le righe relative alle risorse che vuoi conservare. Puoi cogliere l'occasione anche per aggiungere righe a exclusions.txt, in vista di filtraggi futuri.
Eliminare davvero le risorse
Quando sei pronto a eliminare, esegui lo script di eliminazione con un account che disponga dei permessi di scrittura necessari, ad esempio Project Editor.
Modalità pericolosa
L'automazione in cloud è una gran cosa, ma quando si tratta di eliminazioni massive conviene essere particolarmente prudenti e seguire ogni passaggio manualmente. Detto questo, su un progetto di sviluppo o di QA potresti affinare la configurazione di Safe Scrub al punto da sentirti a tuo agio nel generare ed eseguire lo script di eliminazione automaticamente, in un unico passaggio. Per farlo basta inviare l'output in pipe a bash, come mostrato in dangerous-usage-example.sh. In questo caso, il service account dovrà disporre di permessi sia di lettura sia di scrittura, come Project Editor.
Casi d'uso
Dev e QA vs. produzione
Safe Scrub è pensato per i progetti di sviluppo e QA, dove si vuole ripartire da zero a fine giornata o prima di una nuova sessione di test. Difficilmente sarà utile in produzione, dove è opportuno valutare le possibili dipendenze tra i componenti prima di eliminare qualsiasi cosa.
Sbloccare le dipendenze
È utile anche quando una dipendenza residua blocca l'eliminazione di un'altra risorsa. Per esempio, non puoi eliminare un cluster Google Kubernetes Engine se esiste un backend che vi punta, anche quando quel backend non è effettivamente utilizzato da un load balancer. Usa Safe Scrub per generare i comandi di eliminazione di tutte le risorse, poi scegli la riga di comando che ti serve per eliminare il backend e sbloccare il cluster.
Ambito attuale e prospettive future
Servizi supportati e non supportati
Google Cloud conta oltre 90 prodotti e Safe Scrub non li copre tutti. Mi sono concentrato sui servizi più comuni e rilevanti, quelli che vengono creati e smontati nei tipici flussi di sviluppo e QA. Tra questi rientrano risorse di GCE, PubSub, App Engine, Cloud SQL, Cloud Storage, Functions e GKE. Tra i servizi non supportati figurano invece Composer, Data Catalog, Data Proc e molti altri. L'elenco completo dei servizi supportati e non supportati è riportato nel testo di utilizzo. (Esegui ./generate-deletion-script.sh.)
Tipi di risorse supportati e non supportati
Non tutti i tipi di risorse di ciascun servizio sono necessariamente supportati, anche se credo di aver coperto i più importanti, omettendo in particolare quelli la cui eliminazione comporta rischi elevati. Per esempio, in App Engine sono supportati servizi, versioni, istanze e regole firewall, ma non i certificati SSL. Se vuoi vedere supportate altre API o tipi di risorse, invia pure una pull request o apri una issue su GitHub.
Possibili sviluppi futuri
Una versione futura di Safe Scrub potrebbe usare il comando gcloud resources list (in alpha a giugno 2020) per coprire in modo completo tutte le risorse. Non è però detto che imboccheremo questa strada: alcuni tipi di risorse non si prestano all'eliminazione (come IAM, Secrets e certificati SSL, dove rischieresti di cancellare qualcosa di importante). Inoltre, alcuni tipi di risorse hanno comandi di eliminazione differenti. (Per esempio, per Cloud Storage usiamo gsutil al posto di gcloud, e per BigQuery useremo bq.)
Per iniziare
Clicca qui per scaricare il progetto open-source Safe Scrub.
Decomprimi il file ed esegui ./generate-deletion-script.sh per visualizzare le istruzioni d'uso; il file usage-example.sh ne mostra un esempio.
Il quick-start più semplice in assoluto è questo:
- Scarica la chiave di un service account con ruolo Project Viewer, salvandola come
project-viewer-credentials.jsonnella directory di Safe Script. - Quindi esegui
./generate-deletion-script.sh -p <YOUR_PROJECT_NAME>.