Entendiendo la Eliminación de Buckets S3 en CDK

Si has estado siguiendo este blog, puedes haber notado que consistentemente incluyo dos parámetros específicos al crear buckets S3:

const someBucket = new s3.Bucket(this, "someBucket", {
  // ... más propiedades del bucket, a veces ninguna
  removalPolicy: cdk.RemovalPolicy.DESTROY,
  autoDeleteObjects: true,
});

Estos parámetros trabajan juntos para asegurar que el bucket sea completamente removido cuando el stack de CloudFormation sea eliminado. Echemos un vistazo a cómo funciona cada uno y por qué ambos son necesarios.

Políticas de Eliminación

El parámetro removalPolicy determina qué sucede con un recurso cuando ya no es gestionado por CloudFormation. Acepta cuatro valores posibles:

  • DESTROY: El recurso será destruido cuando sea removido del stack, o cuando el stack sea eliminado.
  • RETAIN: El recurso se mantiene, y se convierte en huérfano del stack.
  • SNAPSHOT: El recurso será removido, pero se guardará un snapshot antes de la eliminación.
  • RETAIN_ON_UPDATE_OR_DELETE: Un flujo algo complicado, pero la esencia es que los nuevos recursos serán eliminados, pero mantendremos los que están actualmente en uso.

El valor por defecto para buckets (y algunos otros recursos que pueden almacenar datos) es RETAIN. Es así para que no perdamos accidentalmente datos críticos si eliminamos un stack sin pensarlo mucho.

Requisitos de Eliminación de S3

AWS S3 tiene un mecanismo de seguridad incorporado: no puedes eliminar un bucket a menos que esté completamente vacío. Esto previene la eliminación accidental de buckets que contienen datos importantes.

Debido a esta restricción, establecer removalPolicy: DESTROY por sí solo no es suficiente. El bucket debe ser vaciado antes de que CloudFormation pueda eliminarlo exitosamente, que es donde autoDeleteObjects: true entra en juego.

Cuando habilitas autoDeleteObjects, CDK crea un recurso personalizado detrás de escenas (una función Lambda) que maneja la eliminación de objetos. La lambda es llamada como parte del proceso de eliminación del stack, y se asegura de que el bucket esté vacío para el momento en que CloudFormation intenta remover el bucket.

Si has desplegado stacks con esta configuración, puedes haber notado una función Lambda inesperada en tu consola de AWS Lambda que se ve algo así:

Lambda de Auto Eliminación

Esta es esa función auto-generada, la responsable de vaciar tu bucket S3 durante el proceso de limpieza.

La Conclusión

Esto puede parecer un detalle menor de infraestructura, pero entender estos mecanismos te dará una mejor idea de cómo gestionas tus recursos, y te permitirá tomar mejores decisiones de diseño.

Solo recuerda tener cuidado con estas opciones y usarlas principalmente para infraestructura de desarrollo o staging. Usar las opciones en tus entornos de producción es bastante arriesgado, así que recomiendo que dejes los valores por defecto en su lugar. ¡Es mejor tener un bucket huérfano que darse cuenta de que accidentalmente perdiste gigabytes o terabytes de datos críticos de uno de tus clientes!

¡Espero que esto te sea útil!

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, un ingeniero de software y consultor que vive en Budapest. Me especializo en computación en la nube e IA/ML, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería