Prevenir la destrucción de instancias en AWS con Terraform

Proteja su infraestructura de producción en AWS de un borrado accidental

Eliminar infraestructura es perfectamente normal en entorno de desarrollo, sin embargo en producción es importante proteger algunas instancias y recursos de un borrado accidental por Terraform.

Actualizaciones:

  • 2020 Jul 03: Actualizado a Terraform 0.12
Prevenir la destrucción de instancias en AWS con Terraform 1

Se podría pensar que al estar usando Terraform para definir nuestra infraestructura como código, se puede recrear de nuevo en minutos, y es verdad dependiendo del tamaño, así que en teoría no es un problema eliminar una instancia, una base de datos o una VPN, sin embargo en cuanto se está en producción es inaceptable que los sistemas y las aplicaciones estén caídas.

Recrear una instancia es una operación fácil y rápida cuando se utiliza AWS y Terraform, pero despúes hay que instalar software, configurarlo, desplegar aplicaciones, quizás cargar datos desde una copia de seguridad y esto puede llevar mucho tiempo.

En un mundo de micro-servicios y aplicaciones cloud native, añadir instancias y removerlas del grupo es rápido y deseable, pero en la realidad no todo es un micro-servicio o tiene réplicas para obtener alta disponibilidad o redundancia.

Pensemos en una base de datos Cassandra, un nodo de Elasticsearch o una base de datos tradicional como Oracle o MySQL.

Su resposnsabilidad es proteger esos nodos y sólo en caso de un grave fallo o un mantenimiento programado reemplazarlos.

Cómo prevenir la destrucción de infraestructura en Terraform

No existe una forma de prevenir la destrucción directamente en Terraform, sin embargo sí existe en AWS y la podemos usar para impedir su eliminación por parte de Terrafrom

Las instancias de AWS tienen algunas propiedades que las protegen tales como:

  • Mantener los volúmenes AWS EBS al terminar la instancia
  • Activar la protección AWS EC2 Instance Termination Protection
  • Activar la protección AWS RDS instance Deletion protection (Disponible desde Sep 2018)

Por defecto, todos los volúmenes AWS EBS root devices se eliminan cuando la instancia es terminada. Las instancias EC2 y RDS se pueden terminar utilizando el API de AWS o el panel de control web de AWS.

Para cambiar este comportamiento, en Terraform incluimos una variable global que indica si la infraestructura está en producción (y hay que protegerla) o no.

terraform.tfvars

is_production = false

La variable is_production será falso durante el desarrollo de plantes de Terraform y será cambiada a verdadero tan pronto como la infraestructura pase a producción o deba ser protegida.

Evitar el borrador de instancias EC2

Cuando se crea una instancia, el valor de is_production será usado para fijar el valor de disable_api_termination y delete_on_termination como se muestra en el ejemplo:

aws_ec2_pro_srv1234.tf

resource "aws_instance" "srv1234" {
 ....
 disable_api_termination = var.is_production ? true : false
 instance_initiated_shutdown_behavior = "stop"
 ...
 root_block_device {
 ...
 delete_on_termination = var.is_production ? false : true
}
...
}

Cuando esta configuración está aplicada y el valor de is_production es verdades y la infraestructura se encuentra desplegada, tendrá que acceder a la consola web de AWS o editar sus recursos de Terraform para cambiar los valores de instance_initiated_shutdown_behavior y disable_api_termination que se le permita eliminar la instancia.

Un tercer parámetro de configuración configura el comportamiento cuando se apagar una instancia, el comportamiento por defecto es parar la instancia pero también se puede indicar que sea destruida.

Evitar la destrucción de instancias AWS RDS

También es posible prevenir la eliminación accidental de las instancias de base de datos AWS RDS utilizando la propiedad deletion_protection, el valor por defecto es falso lo que permite su borrado.

aws_rds_pro_rds789.tf

resource "aws_db_instance" "rds789" {
 ....
 deletion_protection  = var.is_production ? true : false
 ...
}

Esta nueva funcionalidad para prevenir el borrado de bases RDS de datos fué incluida en AWS el 26 de septiembre de 2018.

Controlando estas variables se pueden evitar multitud de problemas, como por ejemplo cuando una base de datos Multi-AZ RDS ha cambiado de zona de disponibilidad por mantenimiento o una actualización y Terraform se encuentra una discrepancia con su estado local. En este caso Terraform piensa que la base de datos debe ser recreada en la zona de disponibilidad configurada inicialmente, por lo cual procede a eliminarla y crearla de nuevo si se aplica el plan. Al tener activada la configuración de deletion_protection se evita este problema.

Prevenir la destrucción de instancias en AWS con Terraform

Leave a Reply

Your email address will not be published.