14 Nov 2022
Cómo definir infraestructura como código en AWS con CDK
26 Ene 2021
Definir la infraestructura como código es una práctica recomendada dentro de las metodologías DevOps. En este artículo veremos cómo usar AWS Cloud Development Kit (CDK) para definir y desplegar de manera rápida y flexible nuestra infraestructura en AWS y explicaremos a través de un ejemplo como hacerlo.
Probablemente hayamos leído alguna vez la expresión IaC (Infrastructure as Code). Consiste básicamente en definir la infraestructura como código de modo que en base a diversos ficheros de configuración podamos regenerar toda la infraestructura necesaria para nuestros servicios. Esta aproximación nos proporciona diversas ventajas:
- Automatización: Podremos desplegar nuestra infraestructura de manera automática más fácilmente.
- Consistencia: Aplicando los cambios definidos en un fichero de configuración podremos reducir los errores humanos que podrían provocar inconsistencias..
- Recuperación ante desastres: Podremos recrear más rápidamente toda nuestra infraestructura en caso de ser necesario.
- Versionado: De este modo se tienen trazados los cambios que se van realizando.
- Homogeneidad: Podemos desplegar rápidamente un entorno nuevo igual homogéneo respecto al que tenemos por ejemplo para realizar pruebas.
- Organización: De igual modo, podremos borrar rápidamente los recursos que ya no sean necesarios por ejemplo al finalizar un proyecto manteniendo nuestras cuentas limpias y bien organizadas.
Existen varias tecnologías para definir la infraestructura como código. Podríamos separarlas en dos tipos:
- Declarativas: Se define cómo debería quedar el estado final con ficheros declarativos del tipo YAML, JSON o basados en JSON. Ejemplos de este tipo serían: Terraform, Serverless Framework, AWS SAM o AWS CloudFormation.
- Lenguajes de alto nivel: Otra aproximación sería definir la infraestructura empleando un lenguaje alto nivel. Esto nos permite mayor flexibilidad por ejemplo a la hora de reutilizar código en distintos proyectos. Entre estos tendríamos: Pulumi, Troposphere, AWS CDK. En este artículo vamos a hablar de este último.
AWS CDK – ¿Qué es?
AWS CDK es un framework open source para definir infraestructura en la nube y provisionarla empleando AWS Cloudformation.
Esta sería la estructura de una definición de infraestructura realizada con AWS CDK:
- AWS CDK App: se compone de uno o más stacks de CloudFormation que se generan programando en cualquiera de los siguientes lenguajes:
Javascript, Typescript (Nodejs ≥ 10.13.0), Python (≥ 3.6), Java (≥ 8) o .NET (.NET Core ≥ 3.1). - Un stack es una agrupación de recursos. Esto nos permitiría con la configuración adecuada por ejemplo borrar un stack y todos sus recursos asociados se eliminarían.
- Se definen componentes reusables llamados constructs. También podemos utilizar constructs ya definidos.
- Por tanto, nuestra definición realizada con AWS CDK internamente genera plantillas de CloudFormation que se despliegan, provisionando los diferentes recursos definidos.
Veámoslo en más detalle en la siguiente sección, donde instalaremos CDK y desplegaremos una lambda fácilmente:
Requisitos previos
Antes que nada, debemos tomar en cuenta los prerrequisitos que necesitamos tener instalado en el equipo desde donde vamos a desarrollar y desplegar nuestra IaC.
- Cuenta de AWS configurada, ya sea utilizando tus credenciales personales o temporales.
- Node.js 10.3 o alguna versión posterior instalada.
- Python 3.6 o superior instalada.
- Paquetes pip y virtualenv instalada.
Instalar el CDK
El comando para instalar CDK es:
npm install -g aws-cdk
Para comprobar la versión que tenemos instalada podemos ejecutar el comando:
cdk --version
Primeros pasos
En este ejemplo vamos a desplegar un arquitectura serverless por ello crearemos una lambda, la cual se ejecutará en base a un evento generado cuando se cree un objeto en un path de S3.
1.Creamos un proyecto/aplicación CDK, indicando el lenguaje que vamos a utilizar, en nuestro caso python, por buenas prácticas es recomendable realizar estas pruebas en un entorno virtual y así no afectar a nuestro equipo local.
mkdir HelloWorld cd HelloWorld # Crea la aplicación CDK cdk init app --language python # Activa el entorno virtual source .venv/bin/activate # Editamos setup.py y añadimos las dependencias necesarias (ver más adelante en el apartado Código de ejemplo) vi setup.py # Instala las dependencias pip install -r requirements.txt
2. Los ficheros importantes que se generan en el paso anterior son:
- app.py: Punto de entrada principal de la aplicación, en el cual importamos cdk y los recursos que va a utilizar nuestra aplicación de ejemplo.
- hello_world/hello_world_stack.py: Define los recursos a desplegar en nuestra aplicación de ejemplo.
3. Editamos el fichero hello_world/hello_world_stack.py agregando los recursos a desplegar en el fichero.
4. Creamos los ficheros adicionales de las dependencias que sean necesarias, en este ejemplo el código de la función lambda lambda/lambda-handler.py.
5. Para comprobar que todo está bien y no hemos cometido algún error, ejecutamos el comando synth para ver un resumen de lo que vamos a desplegar:
cdk synth
6. Antes de desplegar en la cuenta de AWS que hayamos configurado, tenemos que preparar el entorno con el comando:
cdk bootstrap
Este comando crea un bucket en AWS S3 el cual será usado por CDK como contenedor de la plantillas intermedias generadas.
Nota: Por defecto el bucket que crea es público, pero puedes definir su comportamiento, es decir indicarle que el bucket sea privado, ponerle un nombre personalizado, etc, puedes ver más detalles en Bootstrapping your AWS environments.
7. Finalmente desplegamos nuestra primer ejemplo con el comando:
cdk deploy cdk deploy CdkAppStack: deploying... CdkAppStack: creating CloudFormation changeset... [██████████████████████████████████████████████████████████] (9/9)
✅ CdkHelloWorld Stack ARN: arn:aws:cloudformation:us-east-1...
Como podemos ver, con unas pocas líneas de código hemos desplegado nuestra infraestructura.
8. Para eliminar el ejemplo que hemos creado, basta ejecutar el comando:
cdk destroy
Código del ejemplo
A continuación veremos el contenido de los principales ficheros del ejemplo anterior:
setup.py
# se muestra solo lo que hemos añadido install_requires=[ "aws-cdk.core==1.91.0", "aws-cdk.aws_lambda==1.91.0", "aws-cdk.aws_s3==1.91.0", "aws-cdk.aws-s3-notifications==1.91.0", ],
app.py
#!/usr/bin/env python3 from aws_cdk import core from HelloWorld.HelloWorld_stack import HelloWorldStack # Punto de entrada de la aplicación app = core.App() HelloWorldStack(app, "HelloWorld") app.synth()
hello_world/hello_world_stack.py
# Importamos los constructores a utilizar dentro de la aplicación from aws_cdk import ( aws_lambda as _lambda, aws_s3 as _s3, aws_s3_notifications, core ) class HelloWorldStack(core.Stack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # create lambda function, the code is in the lambda folder function = _lambda.Function(self, "lambda_function", runtime=_lambda.Runtime.PYTHON_3_7, handler="lambda-handler.main", code=_lambda.Code.asset("lambda")) # create s3 bucket s3 = _s3.Bucket(self, "s3bucket") # create s3 notification for lambda function notification = aws_s3_notifications.LambdaDestination(function) # assign notification for the s3 event type (ex: OBJECT_CREATED) s3.add_event_notification(_s3.EventType.OBJECT_CREATED, notification)
lambda/lambda-handler.py
def main(event, context): # save event to logs print(event) return { 'statusCode': 200, 'body': event }
Consideraciones finales
- AWS CDK está en constante evolución, para lo bueno y lo malo, ya que no todas las funcionalidades de CloudFormation están integradas (en el momento que publicamos el post), y las que ya existen podrían cambiar, por ello hay que tener mucho cuidado con la versión de AWS CDK a utilizar.
- AWS CDK te permite definir IaC de una forma más “divertida” y flexible, ya que dejarás de usar ficheros declarativos (YAML, JSON).
- Hay que tener en cuenta que el mismo código de AWS CDK de distinta versión puede crear internamente templates de cloudformation distintas.
- Como hemos podido comprobar, AWS CDK es una opción muy a tener en cuenta a la hora de definir nuestra infraestructura como código por su versatilidad, rapidez y su sencillez.
- Estas características al final se traducen en un menor Time to Market de nuestros servicios, es decir, podremos realizar cambios y evolucionar la arquitectura de nuestros servicios de manera mucho más ágil.
Las opiniones vertidas por el autor son enteramente suyas y no siempre representan la opinión de BBVA Next Technologies.
¿Quieres saber que más cosas hacemos en BBVA Next Technologies?
Posts relacionados
14 Sep 2020
04 Jun 2020