¿Que es Pulumi? La respuesta corta, una herramienta similar a Teraform para generar y manejar infraestructura en la nube a través de código (IaC). Pulumi se destaca sobre otras soluciones en la habilidad de utilizar ciertos lenguajes de alto nivel para codificar la infraestructura. Esto es excelente pues muchas veces resulta tedioso tener que salir un poco del confort de nuestro lenguaje favorito para repasar instrucciones o patrones que no usamos constantemente. Para un listado completo de los lenguajes disponibles puedes revisar la documentación.

Veamos un poco como se configura el asunto. En Pulumi, el código reside dentro de un proyecto. Pulumi define como proyecto cualquier carpeta que contenga el archivo Pulumi.yalm. Este archivo se genera utilizando el CLI de Pulumi a través de la siguiente instrucción:

pulumi new 

Es importante destacar que esta carpeta debe estar vacía porque de lo contrario no generará el archivo inicial a menos que sea forzado a través de:

pulumi new --force

Pulumi te preguntará que template deseas utilizar y la información básica para tu proyecto. Puedes aceptar los valores default ya que luego, estos pueden ser cambiados. En mi caso voy a utilizar el template de azure-typescript.

Una vez completado este proceso de configuración inicial, Pulumi procederá a descargar las dependencias y completar la instalación de estas. Antes de proceder a ejecutar el template creado, vamos a repasar los elementos que nos ofrece este template. Para realizar esta verificación vamos a utilizar el comando:

pulumi up

Este template creará un Resource Group y un Storage Accout. Los recursos serán creados una vez confirmes pero antes de confirmar, vamos a verificar que información tenemos en la opción de details:

Ok… ¡esos no son los nombres que deseo utilizar oficialmente para mis recursos! Pulumi por default le añade un sufijo aleatorio al cada uno de los nombres. Vayamos al template para cambiar esa configuración.

Explorando el método ResourceGroup

Vayamos a la siguiente expresión:

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("resourceGroup");

Según la documentación de Pulumi, este método además de definir el nombre del recurso con un string, puede manejar un objeto con varias propiedades. Para nuestro ejemplo utilizaremos resourceGroupName.

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("demo-pulumi-rg", {
    resourceGroupName: "demo-pulumi-rg"
});

Ahora si revisamos nuevamente los detalles de nuestra configuración, podemos ver el nombre del recurso sin el sufijo. Listo, ahora nuestros recursos serán nombrados tal y como esperábamos.

¿Y si mi proyecto en la nube ya tiene recursos configurados?

Hay ocasiones en donde vamos a necesitar hacer referencia a uno o varios recursos existentes. Pulumi puede manejar esta actividad a través de la opción de Imports. Hay varias maneras de utilizar esta funcionalidad. Para esta ocasión utilizaremos nuevamente el método ResourceGroup. Además de manejar objectos con diferentes argumentos para definir nuestro recurso, ResourceGroup también puede recibir otro objecto para tareas que necesiten alguna customización adicional. La interfase CustomResourceOptions provee dicha funcionalidad y es aquí donde vamos utilizar el mecanismo de Import para apuntar recursos existentes y manejarlos a través de nuestro proyecto de IaC.

Para pode utilizar un recurso existe es importante conocer la dirección completa de este recurso. Esto lo podemos obtener fácilmente utilizando el Azure CLI. Puedes también hacerlo a través del portal, pero para nuestro ejemplo utilizaremos el Azure CLI.

az group show --name “aqui-va-el-nombre-del-recurso-existente”

El id es justamente lo que utilizaremos.

Ahora en nuestro template añadimos el nuevo objeto.

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("jolmo-rg", {
    resourceGroupName: "jolmo-rg", 
}, {import: "/subscriptions/X#X#X#X/resourceGroups/jolmo-rg"} );

Nuevamente revisamos nuestra configuración a través de pulumi up.

Ahora nuestra configuración tendrá disponible el recurso existente, previamente creado, y Pulumi se encargará de manejar el state de la infraestructura.

En conclusión

Solo hemos visto la básico del gran potencial de Pulumi. A través de esta breve introducción hemos logrado utilizar un template básico para definir recursos en Azure. Además, exploramos como puedo utilizar diferentes métodos para augmentar los valores de los recursos. Y por último hemos importado recursos existentes a nuestro código de infraestructura. Espero que está introducción sirva para alimentar las curiosidad sobre los beneficios de Pulumi, pero más aún, que sirva de inspiración para aprender más sobre el tema de Infraestructura como Código.