Pulumi: IaC Multi-Lenguaje y Multi-Plataforma

Miguel Fontanilla
Computación en la nube
March 4, 2021

Pulumi: IaC Multi-Lenguaje y Multi-Plataforma 📚🏗️

               

Bienvenido al segundo artículo sobre Infraestructura como Código (IaC) utilizando lenguajes de programación populares y de alto nivel.El primero presentaba el AWS CDK. En este artículo presentaremos Pulumi, una herramienta similar que ofrece soporte multi-cloud.

La Infraestructura como código (IaC) es una de las mayores revoluciones en el panorama de la computación en la nube, ya que permite automatizar el despliegue de infraestructura en base a la definición especificada en el código. El hecho de utilizar código como fuente de verdad para la infraestructura tiene varios beneficios:

  • La infraestructura puede versionarse, como normalmente se hace con el código, proporcionando trazabilidad de la misma.
  • Los despliegues, rollbacks, y procedimientos de recuperación ante desastres pueden automatizarse fácilmente, reduciendo la intervención manual y por tanto la probabilidad de errores humanos.
  • Los costes se reducen, ya que los recursos pueden redimensionarse modificando el código para adaptarlos a las fluctuaciones de tráfico y uso, y los entornos pueden apagarse cuando no se están utilizando.
  • Los procesos de despliegue se aceleran de forma significativa, haciendo el ciclo de vida de desarrollo del software más eficiente, ya que los entornos pueden desplegarse cuando se necesitan.

La IaC puede implementarse por medio de diferentes herramientas, siendo Terraform, AWS CloudFormation, Ansible, Chef o Puppet algunas de las más utilizadas. Estas herramientas utilizan normalmente lenguajes declarativos (o dialectos), basados en YAML, JSON y derivados del JSON para la definición de la infraestructura. Trabajar con estas herramientas y lenguajes puede ser todo un reto, especialmente para aquellos con un background más cercano al desarrollo.

Por ello, tiene sentido el desplegar infraestructura utilizando lenguajes de alto nivel, que son más naturales para los desarrolladores. Este enfoque puede incrementar la productividad, ya que los patrones de desarrollo comunes pueden reutilizarse con facilidad. Este modelo de trabajo permite a los desarrolladores provisionar infraestructura de forma sencilla e intuitiva, sin necesidad de ser expertos en la materia. Además, los desarrolladores pueden provisionar stacks completos, conteniendo las aplicaciones y la infraestructura sobre la que corren, utilizando su IDE y lenguaje de preferencia. Esto puede ser particularmente útil en pequeñas y medianas empresas y proyectos, en las que un solo equipo se encarga de gestionar y operar la parte 'Dev' y 'Ops'.

Pulumi overview by Pulumi

A lo largo de este artículo se analizará Pulumi y sus funcionalidades. Pulumi es un framework de código abierto que permite crear y gestionar infraestructura y aplicaciones sobre proveedores de nube pública utilizando lenguajes de programación comunes y ampliamente extendidos, como Typescript, Javascript, Python, Go y C#.

Para los ejemplos que se muestran en el artículo, se escogió Python como lenguaje de programación, desplegando la infraestructura resultante sobre diferentes proveedores de nube pública. Puedes encontrar el código que se emplea para desplegar los ejemplos que se muestran a continuación en el repositorio de ejemplos de Pulumi.

Configurando Pulumi⚙️

El primer paso es instalar Python 3, específicamente Python 3.6 o versiones posteriores. Puedes descargar la última versión de Python 3 en esta página. Una vez que tengas Python 3 instalado, el siguiente paso es instalar Pulumi en tu máquina. Para las distribuciones de Linux, puedes ejecutar el siguiente comando. Para cualquier otro SO, puedes encontrar el manual de instalación en esta página.

Para poder usar Pulumi en tu línea de comandos, necesitaras registrarte primero en la consola web de Pulumi, para que el estado de tu stack pueda ser persistido. No te preocupes, ya que Pulumi es gratuito para uso personal, y puedes registrarte utilizando tus cuentas de GitLab, GitHub, Atlassian o tu correo.

Una vez que te hayas registrado, es el momento de generar un token de acceso, ya que el CLI necesita uno para poder acceder a la cuenta y almacenar la información del stack.

Finalmente, ejecuta el siguiente comando y pega el token de acceso que acabas de generar el paso anterior. Si todo va bien, deberías ver una salida en el terminal similar a la que se muestra en la siguiente imagen.

Estructura del proyecto🔖 

Si tuvieras que generar tu primer proyecto con Pulumi, tendrías que crear un directorio y ejecutar los siguientes comandos, especificando el proveedor de cloud a utilizar y el lenguaje de programación elegido.

En este caso, el CLI de Pulumi te guiaría a través de un proceso de setup bastante sencillo, donde se pueden especificar varios parámetros, como el nombre del proyecto, su descripción, el nombre del stack y la región en la que se desplegaría. Sin embargo, ten en cuenta que para los ejemplos que se muestran en este artículo, se emplean proyectos preconfigurados, y por ello, no es necesario que lleves a cabo este procedimiento de setup, es sencillamente una indicación por si quisieras desarrollar tu propio proyecto desde cero.


Después de configurar el proyecto (usando Python en este caso), los ficheros que se encuentran en el directorio del proyecto serán parecidos a los que se ven en la siguiente imagen. Pulumi.yaml y Pulumi.dev.yaml son los ficheros de configuración del proyecto y del stack respectivamente, mientras que __main__.py es el Programa de Python en el que se define el stack. El fichero requirements.txt especifica las dependencias que el stack necesita para funcionar y el directorio venv es un Python virtual environment, que contiene todos los ejecutables y las librerías necesarias para hacer uso de los paquetes importados en el proyecto de Python.

El siguiente extracto muestra el contenido de un fichero Pulumi.yaml . Para hacer que Pulumi funcione, es necesario definir al menos name y runtime. Bajo la ruta template.config, se pueden especificar valores obligatorios para que el stack pueda crearse.

Desplegando el Stack🤖

Para probar Pulumi con diferentes proveedores de cloud, utilizaremos el repositorio de ejemplos de Pulumi. Clónalo en tu máquina utilizando git para poder empezar.

AWS☁️🔶 

Antes de desplegar el stack, necesitarás configurar tus credenciales de AWS, utilizando el AWS CLI (puedes descargarlo en esta página).Para ello, necesitarás un par de access key y secret key de AWS. Si no dispones de uno, puedes generarlo en la consola de IAM de AWS. Consulta la documentación oficial como referencia si lo necesitas.

Ten en cuenta que el usuario al que se le asignen dichas claves de acceso debe tener permisos para crear la infraestructura. Para este ejemplo puedes utilizar la policy gestionada AdministratorAccess . Guarda bien el par de claves, y una vez que termines de probar estos ejemplos y este usuario no sea necesario, elimínala, para evitar riesgos innecesarios.

Para AWS, utilizaremos el ejemplo de EKS con Python. Este ejemplo contiene tres ficheros con el código de Python: __main__.py, iam.py y vpc.py, en los que se define respectivamente, el clúster de EKS, sus roles y políticas de IAM asociados y los recursos de red necesarios para poder crear las instancias. El código que se muestra a continuación es el contenido de __main__.py , que define un clúster de EKS con dos workers. Tómate tu tiempo para inspeccionar los diferentes ficheros, y así poder tener una idea general del stack completo a desplegar.

Puedes encontrar los ficheros para llevar a cabo el despliegue en el directorio aws-py-eks .

Crea el virtual environment y actívalo. Una vez hecho esto, instala los paquetes especificados en requirements.txt.

Una vez que toda la parte de Python esté lista, inicializa el stack. Si accedes a la consola de Pulumi tras hacerlo, puedes comprobar tu nuevo stack y sus tags.

Selecciona la región de AWS en la que se desplegará el stack.

Ejecuta el siguiente comando para que Pulumi genere el plan de despliegue. Si el plan tiene buena pinta, selecciona yes y espera hasta que el stack sea desplegado⌛.

Actualiza tu Kubeconfig local para poder acceder al nuevo clúster.

Y voilà, el clúster fue creado correctamente!

Una vez que termines de jugar con el clúster, destruye la infraestructura y elimina el stack. Comprueba que los recursos a destruir coinciden con los creados anteriormente. Ejecutando el comando deactivatedesactivará el virtual environment utilizado anteriormente.

GCP☁️ 🌈

Al igual que en el ejemplo anterior, es necesario configurar las credenciales (en este caso de GCP) para que puedan ser utilizadas por Pulumi. Puedes utilizar el gcloud CLI para configurar las credenciales de acceso. Ejecutando los siguientes comandos establecerás las credenciales por defecto, el proyecto de GCP y te autenticarás utilizando el gcloud SDK.

El código que se muestra a continuación es el contenido en __main__.py que puede encontrarse dentro del repo de ejemplos en esta ruta. Este fichero de Python genera un clúster de GKE, el servicio de Kubernetes gestionado de GCP, y crea un despliegue canary de nginx. Para crearlo, genera un Kubeconfig (k8s_config) que permite a Pulumi autenticarse y acceder al clúster.

Prepara el entorno de Python e inicializa el stack tal y como hiciste en el ejemplo anterior.

Este ejemplo emplea algunas variables a las que se les debe asignar un valor antes de generar el plan de despliegue. Para hacerlo, puedes utilizar el comando pulumi config set . Ten en cuenta que la contraseña que introduzcas debe tener al menos 16 caracteres!

Una vez que asignes valores a dichas variables, puedes generar el plan de despliegue y aceptarlo si todo va bien.

Si accedes a la consola de Pulumi tras crear la infraestructura podrás ver los diferentes recursos que se crearon, así como los outputs generados y las variables que se definieron para el stack.

El Kubeconfig que se crea en el código puede obtenerse como un output de Pulumi. Sin embargo, se trata de un output cifrado dentro del stack, por lo que es necesario utilizar el flag –show-secrets para poder obtenerlo en claro🔐.

Utilizando este Kubeconfig, podrás acceder al clúster utilizando kubectly comprobar cómo el despliegue canary se encuentra presente.

Al igual que en el ejemplo anterior, una vez que hayas terminado de probar el clúster, elimina los recursos, el stack de Pulumi y desactiva el virtual environment de Python.

Azure☁️🔷

El repositorio de ejemplos de Pulumi incluye un ejemplo similar a los anteriores pero utilizando el servicio de Kubernetes gestionado de Azure (AKS). No obstante, estoy seguro de que ya te has hecho una idea general de como utilizar Pulumi para desplegar clústers gestionados😉 . Por ello, si tienes interés en probarlo, puedes seguir las instrucciones que encontrarás en el propio repositorio y desplegar un clúster de AKS.

Pulumi y Kubernetes☸️

Por último, Pulumi puede interaccionar directamente con clústers de Kubernetes

(tanto gestionados como no gestionados) para desplegar aplicaciones y recursos. El siguiente código crea un deployment de nginx simple en Kuberneres utilizando Python.

Para poder interaccionar con el clúster solo necesitarás establecer el valor de la variable KUBECONFIG con el path del fichero Kubeconfig del clúster que quieras usar. Una vez que lo hayas configurado, ejecuta los siguientes comandos para desplegar el stack.

Si inspeccionas los pods y los despliegues dentro del clúster, verás que los recursos definidos en el fichero de Python han sido creados correctamente por Pulumi.

Haz limpieza una vez que hayas terminado de probar!

Sigue aprendiendo👩‍💻👨‍💻

Si te ha gustado Pulumi, tómate tu tiempo para investigar dentro del repositorio de ejemplos, ya que encontrarás un montón de casos de uso interesantes. utilizando diferentes lenguajes de programación y diferentes proveedores de cloud.

Algunos de los casos de uso más interesantes son:

Conviértete en un 'Políglota de la IaC', confía en mí, merece la pena😎!



Miguel Fontanilla

DevOps/Cloud Engineer at Orange. Cloud Architecture, Virtualization, Services Orchestration, Automation and Optimization. Always learning.

Related Posts

Boletin informativo SpainClouds.com

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form