Cuando diseñas y desarrollas nueva infraestructura en Google Cloud, sueles probar todo tipo de recursos. Eso deja el proyecto hecho un desorden y, encima, te cuesta dinero mientras esos recursos siguen corriendo.
Puedes eliminarlos a mano, pero encontrarlos todos entre los distintos servicios de GCP no es fácil: Compute, Containers, AppEngine, Cloud SQL y muchos más.
Por eso creé el proyecto open-source Safe Scrub: para que esta tarea sea sencilla — ¡y segura!

La seguridad, primero
Safe Scrub se diseñó pensando en la seguridad.
Safe Scrub no elimina recursos; lo que hace es generar un script capaz de hacerlo.
Un script de eliminación transparente
Este script es transparente: como no es más que una lista de instrucciones gcloud delete, puedes ver con claridad qué hará con tus recursos. Una vez generado, revisa cada línea para confirmar exactamente qué se va a eliminar y, recién ahí, ejecútalo.
Esa es la medida de seguridad más importante, pero hay más.
Cuenta y proyecto explícitos
Safe Scrub requiere un archivo de claves JSON con credenciales de una service account, en lugar de tu cuenta de usuario con sesión iniciada. La idea es obligarte a elegir un rol de forma consciente; la service account debería tener un rol sin permisos de escritura, como Project Viewer, ya que la generación del script no necesita ni utiliza permisos de escritura.
Además, puedes asignar un rol aún más limitado si solo te interesa listar recursos de ciertos tipos. Que falle por permisos no es un problema. Si el rol es demasiado restrictivo (o si una API de GCP todavía no está habilitada), Safe Scrub continúa sin inconvenientes; lo único que ocurre es que no podrá listar el recurso no disponible. Simplemente muestra un mensaje de error y sigue adelante.
A diferencia del propio gcloud, Safe Scrub te exige indicar el proyecto de forma explícita, para evitar que se use un proyecto por defecto y termines listando, sin querer, recursos que no pensabas eliminar. El script de eliminación generado también especifica el proyecto en cada comando, de modo que la operación no se ejecute por accidente sobre tu proyecto por defecto actual.
Filtrado
Safe Scrub admite dos tipos de filtrado.
Primero, hay una opción en línea de comandos para que elijas únicamente los recursos que te interesan. Puedes filtrar por etiqueta, nombre, fecha de creación y mucho más, aprovechando todo el potencial del filtrado de gcloud. (Para los buckets de Cloud Storage, donde se usa gsutil en lugar de gcloud, solo se admiten filtros simples de igualdad por etiqueta de una sola clave (key=value1). En el resto de casos, el filtro se ignora.)
Segundo, Safe Scrub admite una lista de exclusión en exclusions.txt. Los recursos cuya URI contenga alguna de esas cadenas no se incluirán en el script de eliminación. Para usar esta función, ejecuta Safe Scrub, identifica los elementos que no deberían eliminarse en el futuro y agrega la URI completa o una parte identificable de ella a exclusions.txt. (En Cloud Functions se usa el nombre en lugar de la URI, debido a un bug en gcloud.)
Por ejemplo, cuando aparecen estas líneas:
networks/default firewalls/default
las redes por defecto y también los firewalls por defecto (cuyas URIs tienen la forma https://www.googleapis.com/compute/v1/projects/my-project/global/firewalls/default-allow-https) no se eliminarán.
Cómo monitorear el proceso de eliminación
La primera vez que ejecutes tus scripts de eliminación, vas a querer ver el proceso a medida que ocurre. Safe Scrub antepone set -x al script para que obtengas salida de depuración.
Para facilitar el monitoreo durante la eliminación, Safe Scrub genera un script secuencial común. Sin embargo, también puedes configurarlo con la opción -b para que genere comandos en segundo plano (asíncronos), de modo que la eliminación de varios recursos ocurra en paralelo. Es más rápido, pero más difícil de seguir, y corre el riesgo de sobrecargar los sistemas con demasiadas llamadas concurrentes.
Próximos pasos: revisar y ejecutar
Ese primer paso solo te entrega un script de eliminación. El siguiente es revisarlo y quitar las líneas correspondientes a los recursos que quieras conservar. También puedes aprovechar para sumar líneas a exclusions.txt y filtrarlas a futuro.
Eliminar los recursos de verdad
Cuando estés listo para eliminar, ejecuta el script con una cuenta que tenga los permisos de escritura correspondientes, como Project Editor.
Modo peligroso
Nos encanta la automatización en la nube, pero cuando hay eliminación masiva de por medio, conviene extremar las precauciones y seguir cada paso manualmente. Aun así, en un proyecto de desarrollo o QA, podrías afinar tu configuración de Safe Scrub lo suficiente como para sentirte cómodo generando y ejecutando el script de forma automática, en un solo paso. Para hacerlo, basta con redirigir la salida con un pipe a bash, como se muestra en dangerous-usage-example.sh. En este caso, tu service account debería tener permisos de lectura y escritura, por ejemplo los de Project Editor.
Casos de uso
Dev y QA vs. Producción
Safe Scrub está pensado para proyectos de desarrollo y QA, donde quieres empezar de cero al final del día o antes de una nueva ronda de pruebas. Es poco probable que sea útil en proyectos de producción, donde antes de eliminar nada deberías analizar las posibles dependencias entre componentes.
Desbloquear dependencias
También resulta útil cuando una dependencia perdida bloquea la eliminación de otro recurso. Por ejemplo, no puedes eliminar un cluster de Google Kubernetes Engine si hay un backend apuntando a él, incluso si ese backend no está siendo usado por un load balancer. Usa Safe Scrub para generar comandos de eliminación para todos los recursos, elige el comando que necesitas para eliminar el backend y libera el bloqueo sobre ese cluster.
Alcance actual y posibilidades a futuro
Servicios soportados y no soportados
Google Cloud tiene más de 90 productos, y Safe Scrub no los cubre todos. Me concentré en los servicios importantes y habituales que se montan y se desmontan en un flujo típico de desarrollo y QA. Esto incluye tipos de recursos de GCE, PubSub, App Engine, Cloud SQL, Cloud Storage, Functions y GKE. Entre los servicios no soportados están Composer, Data Catalog, Data Proc y muchos más. La lista completa de servicios soportados y no soportados aparece en el texto de uso. (Ejecuta ./generate-deletion-script.sh.)
Tipos de recursos soportados y no soportados
No necesariamente se admiten todos los tipos de recursos de cada servicio, aunque creo que cubrí los importantes, omitiendo sobre todo aquellos cuya eliminación es muy riesgosa. Por ejemplo, en App Engine se admiten servicios, versiones, instancias y reglas de firewall, pero no los certificados SSL. Si quieres ver más APIs o tipos de recursos soportados, envía un pull request o abre un issue en GitHub.
Opciones de implementación a futuro
Una versión futura de Safe Scrub podría usar el comando gcloud resources list (en alpha desde junio de 2020) para capturar todos los recursos en su totalidad. Aun así, no está claro que vayamos por ese camino: hay tipos de recursos que no son aptos para este tipo de eliminación (como IAM, Secrets y certificados SSL, donde podrías borrar algo importante). Además, algunos tipos de recursos tienen comandos de eliminación distintos. (Por ejemplo, usamos gsutil en lugar de gcloud para Cloud Storage, y usaremos bq para BigQuery.)
Cómo empezar
Haz clic aquí para descargar el proyecto open-source Safe Scrub.
Descomprime y ejecuta ./generate-deletion-script.sh para ver las instrucciones de uso; el archivo usage-example.sh muestra un ejemplo.
El inicio rápido más simple es este:
- Descarga una clave para una service account con el rol Project Viewer y guárdala como
project-viewer-credentials.jsonen el directorio de Safe Script. - Luego ejecuta
./generate-deletion-script.sh -p <YOUR_PROJECT_NAME>.