AWS CDK: IaC 'a lo Developer'

Miguel Fontanilla
Computación en la nube
July 16, 2020

    AWS CDK: IaC 'a lo Developer' 🖥️🏗️

       

        Miguel Fontanilla       

                

       

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.

IaC by SourceFuse

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'.

En este artículo, se presenta el AWS Cloud Development Kit (CDK). AWS CDK es un framework de desarrollo creado por AWS, que permite crear y gestionar infraestructura y aplicaciones en la nube utilizando lenguajes de programación de alto nivel como Typescript, Javascript, Python, Java O C#. Los ejemplos que se muestran a continuación se desarrollaron utilizando Typescript, pero en el futuro, habrá más artículos con el objetivo de mostrar el funcionamiento con otros lenguajes. Puedes encontrar el código utilizado para llevar a cabo los ejemplos del post en este repositorio.

Configurando el CDK

Para poder utilizar AWS CDK con Typescript, Node.js debe estar instalado. Puedes encontrar la versión para tu SO en este link. Además, el AWS CLI puede ser una herramienta muy útil para configurar las credenciales de AWS en tu máquina. Puedes obtener el AWS cli en esta página. Finalmente, es necesario instalar Typescript si no está instalado ya. Puedes instalarlo con el Node Package Manager (npm).

El siguiente paso es instalar el toolkit de AWS CDK con npm.

Por último, puedes crear un proyecto de Typescript con el AWS CDK ejecutando los siguientes comandos. El comando cdk init genera la estructura de directorios, clases, subcarpetas e instala el módulo core junto con sus dependencias. Sin embargo, puedes encontrar el proyecto que emplearemos en este repositorio. Por lo que no es necesario que crees un proyecto nuevo con el comando cdk init.

Estructura del proyecto

Para desplegar el stack de prueba, puedes clonar el repositorio de ejemplos. Trabajaremos desde el directorio typescript. El comando npm install se encargará de instalar todos los módulos y dependencias necesarias para que el stack funcione.

Tras clonar o inicializar el proyecto, el directorio principal contendrá varios subdirectorios en los que se ubican el código de ejemplo y los módulos y dependencias.

  • lib es el directorio en el que se define el stack de la infraestructura. typescript-stack.ts es el fichero que contiene el stack principal, donde se definen los componentes. Este fichero generará el javascript de salida typescript-stack.js mediante el empleo del transpilador.
  • bin contiene los entrypoints (tanto para Javascript como para Typescript) para la aplicación de CDK. Dichos entrypoints referencian el stack a utilizar.
  • package.json contiene el manifiesto de los módulos de npm.
  • node_modules contiene las dependencias requeridas por el stack.
  • cdk.json y tsconfig.json son los ficheros de configuración del CDK toolkit y Typescript respectivamente.

Desplegando el stack

Al trabajar con el stack de Typescript, es posible ejecutar el compilador en modo watch, de forma que éste compilará automáticamente los cambios en los ficheros de Typescript generando ficheros Javascript. Para lograr esta funcionalidad, es necesario ejecutar el comando siguiente en un terminal diferente, pues quedará corriendo en primer plano. Si no se utiliza el modo watch, cada cambio en los ficheros de Typescript debe ser compilado manualmente.

El código que se muestra a continuación es el contenido de lib/typescript-stack.ts . Crea una instancia EC2 y la configura con un script de bootstrap en el user data para ejecutar una página web estática de Kubes&Clouds. Además, define un VPC con una subred pública en la que lanzar la instancia, así como los security groups necesarios para permitir el tráfico SSH y HTTP hacia la instancia. Puedes observar que en el código se especifica una clave SSH para acceder a la instancia, por lo que deberás sustituirla por el nombre de una de las claves SSH existentes en tu cuenta si quieres tener acceso a la máquina.

Antes de desplegar el stack, necesitarás configurar tus credenciales de AWS, utilizando el AWS CLI. 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 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.

El CLI de AWS CDK puede generar un stack de CloudFormation como salida, utilizando un lenguaje de programación de alto nivel. Para generarlo, ejecuta el siguiente comando.

El extracto que se muestra a continuación, contiene una parte de la salida en CloudFormation generada por el CDK CLI al ejecutar el comando cdk synth .

Antes de realizar el primer despliegue, es necesario crear el stack de bootstrap, requerido por el CDK toolkit para poder trazar los recursos desplegados. El siguiente comando es el que se encarga de crear el stack de bootstrap.

Una vez que el proceso de bootstrap ha finalizado, todo está listo para desplegar el stack que hemos desarrollado. Ejecutando el siguiente comando, mostrará una salida con todos los recursos que serán creados, esperando una confirmación. Si todo lo que ves tiene buena pinta, confirma el despliegue 👌.

Si inspeccionas los stacks de CloudFormation en tu cuenta una vez que el despliegue haya finalizado, podrás ver los diferentes recursos creados por el AWS CDK.

Además, podrás ver un stack adicional, el stack del CDK toolkit, que fue creado durante la fase de bootstrap por el CDK CLI. Este stack genera un bucket S3 en el que se almacenan las definiciones de los recursos y los estados de la infraestructura.

Si accedes a la IP pública de la instancia que se acaba de crear con un navegador, podrás comprobar que todo ha funcionado tal y como se esperaba!

Una vez que hayas acabado de probar el servidor web, destruye el stack y sus recursos asociados con el siguiente comando 🔥.

Equivalencia con Terraform

Si tuvieras que desplegar el mismo stack utilizando Terraform, necesitarías algo parecido al código que ves a continuación. Puedes encontrar este fichero en terraform/main.tf dentro del repositorio de ejemplo. Para esta implementación, se utilizaron módulos del registry de Terraform, con la versión v0.12.28. Este código se añade aquí para que puedas comparar dos maneras diferentes de definir infraestructura como código, pero si quieres probar a desplegarlo, también funcionará. Recuerda que tendrás que modificar la key_name con el nombre de tu clave SSH si quieres acceder a la instancia.

Inicializa el directorio terraform con el código, para que se puedan instalar los módulos y el provisioner de AWS, después construye el plan de despliegue y si todo tiene buena pinta, confirma el despliegue.

Al igual que en el ejemplo anterior, al acceder a la IP pública de la instancia, podrás comprobar que el servidor web desplegado funciona tal y como se espera.

Una vez que hayas terminado de jugar con el despliegue de Terraform, destruye los 

recursos creados.

Hagámoslo más interesante

El ejemplo previo era interesante, pero relativamente básico. Teniendo en cuenta cuánto nos gusta Kubernetes, sería una gran idea desplegar un clúster de Kubernetes utilizando el AWS CDK, verdad? Para ello, utilizaremos uno de los muchos ejemplos que proporciona AWS en su repositorio de ejemplos para el CDK. En este caso, utilizaremos el servicio gestionado de Kubernedes de AWS, conocido como EKS. El código que ves a continuación se encuentra en este repo, junto con los ficheros de configuración de Typescript necesarios para el despliegue.

Siguiendo los mismos pasos que en el ejemplo anterior, el stack generará los recursos en tu cuenta de AWS. En este caso, invocaremos el compilador de Typescript manualmente. Tómatelo con calma, porque el despliegue tarda un ratito⌛.

Tras unos minutos, el clúster de EKS estará desplegado y operativo.

Una vez que el clúster haya sido creado, el CLI de CDK te mostrará los comandos necesarios para generar el Kubeconfig con el AWS CLI.

Ejecuta el siguiente comando para genera el Kubeconfig. Puedes copiarlo directamente desde la salida del CLI de CDK.

Si todo funcionó tal y como debería, tendrás acceso a tu nuevo clúster!

Importante

Si al acceder al clúster de EKS encuentras un error así: You must be logged in to the server (Unauthorized) , tendrás que dar permiso al usuario del AWS CDK para que pueda asumir el rol de creación del clúster. Esto es una consecuencia directa de la manera en la que los roles IAM se mapean al RBAC de Kubernetes. Cuando se crea un clúster, solo el usuario/rol que lo creó puede acceder. Para solucionar el problema de manera sencilla y rápida, dale al usuario de IAM que utilizaste con el AWS CDK permisos para asumir el rol <clustername>-ClusterCreationRole .

Por último, destruye el clúster de EKS y los recursos asociados para que no te lleves ninguna sorpresa con tu factura de AWS💰!

Si quieres aprender más a cerca del AWS CDK, puedes echarle un vistazo a los diferentes ejemplos en el repositorio de ejemplos para el CDK. Hay bastantes casos de uso muy interesantes, incluyendo arquitecturas serverless, y diferentes lenguajes. En el futuro, se publicarán nuevos artículos en Kubes&Clouds del AWS CDK utilizando diferentes lenguajes, así como de su primo multi-cloud, Pulumi.

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