Infraestructura Como Código (IaC). Terraform y ART Template

En un artículo anterior se explicaban los servicios o productos existentes para realizar la infraestructura como código.

En algunos casos puede ser necesario utilizar más de un producto para poder realizar el desarrollo de la infraestructura requerida dentro del código. Por ejemplo, es posible que se esté desarrollando un módulo con Terraform y alguna de las propiedades que se quiera configurar no esté disponible en los módulos de Terraform y haya que utilizar conjuntamente ARM Template.

Pongamos el caso de que estamos desarrollando el módulo de SQL con Terraform y queremos configurar la versión mínima de TLS a la 1.2.

De Terraform a TLS y 1.2

 

Si accedemos a la información del módulo de Terraform de SQL Server nos encontramos con que esa propiedad no existe a día de hoy:

Terraform de SQL Server

 

Para poder incluir esta propiedad y seguir utilizando Terraform existe un resource en Terraform denominado azurerm_template_deployment en el cual se puede incrustar una ARM Template. Para ver qué deberíamos poner en este ejemplo lo primero es acudir a la documentación de Azure para ver cómo se configura el recurso SQL y cuáles de sus parámetros son obligatorios y cuáles no:

Parámetros Template Format Terraform

 

Como se puede ver hay una propiedad que se llama minimalTlsVersion que nos serviría para nuestro propósito. Visualizando las propiedades que son obligatorias y las que no nuestro código de Terraform quedaría de la siguiente manera:

minimalTlsVersion

 

Para evitar posibles errores se deberán de tener en cuenta varias consideraciones:

El type de los parámetros siempre deberá de ser String. Aunque en la documentación de Azure se indique que es de otro tipo dentro de Terraform siempre hay que ponerlo de tipo String puesto que si no fallará.
El deployment_mode hay que ponerlo siempre como Incremental, puesto que si no, las propiedades que se hayan generado previamente con Terraform serán eliminadas y se creará el recurso nuevo con lo indicado en el recurso ARM Template.
En depends_on se pondrán los resources de los que depende este. Típicamente será el recurso del módulo con el que se está trabajando y se requiere incluir alguna propiedad y recurso de tipo resource group o similar de los cuales se requieran datos.