Saltar al contenido principal

Construye tu primera pila CDK de AWS: Un tutorial para principiantes

Aprende a crear e implementar tu primera pila AWS CDK utilizando Python. Esta guía para principiantes cubre la configuración, las construcciones, el despliegue, las pruebas y el CI/CD.
Actualizado 22 may 2025  · 15 min de lectura

Gestionar la infraestructura de la nube con plantillas JSON o YAML sin procesar puede ser tedioso y propenso a errores. El Kit de Desarrollo en la Nube de AWS (CDK) cambia eso al permitirte definir recursos en la nube utilizando lenguajes de programación modernos como Python, TypeScript, Java y C#.

Con CDK, la infraestructura se convierte en código reutilizable, comprobable y controlado por versiones. Te permite pensar como un programador incluso cuando aprovisionas complejos sistemas en la nube.

En este tutorial, aprenderás a configurar un proyecto AWS CDK utilizando Python. Recorreremos el proceso de escribir tu primera pila, añadir un recurso esencial de AWS e implementarlo en tu cuenta de AWS. Al final, entenderás claramente cómo funciona el CDK y cómo utilizarlo para gestionar la infraestructura de una forma fácil para los programadores, con código.

Para comprender mejor las prácticas que hay detrás de herramientas como AWS CDK, explora los principios fundamentales en nuestro curso Conceptos de DevOps.

Requisitos previos

Antes de sumergirnos en la escritura de código con AWS CDK, asegúrate de que tu entorno está configurado correctamente. Esto es lo que necesitarás

Cuenta AWS para experimentación

Necesitas acceso a una cuenta de AWS para desplegar la aplicación que vamos a crear. Si tu sistema ya está configurado con credenciales para un usuario de nivel administrador, no dudes en saltarte el paso.

Siaún no tienes una cuenta de AWS, crea una aquí.

Para un programa de aprendizaje estructurado que cubra los fundamentos de AWS, el programa AWS Cloud Practitioner es un excelente punto de partida.

Usuario administrador

Necesitarás un usuario con acceso programático y permisos completos para seguirlo.

  1. Accede a tu cuenta de AWS.
  2. Abre la Consola IAM.
  3. Crea un nuevo usuario: puedes llamarlo algo así como "datacamp-cdk".
  4. Selecciona Acceso programático.
  5. Haz clic en . Siguiente: Permisos.
  6. Elige Adjuntar directamente las políticas existentes y marca AdministradorAcceso.
  7. Haz clic en Siguiente: Etiquetas,Siguiente: Revisa, y luego Crear usuario.

En la última pantalla, anota tu ID de clave de acceso y tu clave de acceso secreta. Los necesitarás en el siguiente paso.

Configura tus credenciales de AWS

Abre un terminal y ejecuta

aws configure

Se te pedirá que introduzcas las credenciales de la consola IAM:

AWS Access Key ID [None]: <your access key ID>
AWS Secret Access Key [None]: <your secret access key>
Default region name [None]: us-east-1
Default output format [None]: 

Elige un IDE para el desarrollo

El CDK de AWS permite a los programadores trabajar en un entorno de programación completo en lugar de en plantillas YAML o JSON. Este completo entorno te permite utilizar tu IDE preferido y beneficiarte al mismo tiempo de las funciones de completado de código, linting en tiempo real y herramientas de refactorización para una gestión eficaz del código de la infraestructura.

Para conseguir la mejor experiencia de desarrollo con el CDK de Python, te sugiero que utilices un IDE que admita lo siguiente:

  • Resaltado sintáctico
  • Completar código
  • Navegación inteligente y sugerencias
  • Soporte de entorno virtual

Instalar Python y pip

Para utilizar AWS CDK con Python, necesitarás tener instalada en tu sistema la versión 3.8 o superior de Python. Si aún no lo tienes, puedes descargar la última versión desde el sitio web oficial de Python.

Si estás en Windows, asegúrate de que Python está añadido a la variable de entorno PATH de tu sistema. Para comprobarlo, abre un terminal o símbolo del sistema y ejecuta

python --version

Si ves un error del tipo "comando no encontrado" o similar, es probable que Python no esté en tu PATH. La solución más sencilla es marcar la casilla "Añadir Python 3.x a PATH" durante la instalación.

También necesitarás pip, el instalador de paquetes de Python, para instalar las dependencias del CDK de AWS más adelante. La mayoría de las distribuciones modernas de Python vienen con pip preinstalado.

pip --version

Si no está instalado, sigue la guía oficial de instalación de pip.

Primeros pasos con AWS CDK

Antes de escribir ningún código, es esencial entender qué es el CDK de AWS, por qué existe y cómo encaja en el mundo más amplio de la infraestructura como código (IaC). Esta sección te introducirá en los conceptos básicos del CDK y te mostrará cómo se compara con otras herramientas populares de IaC.

¿Qué es AWS CDK y por qué se utiliza?

AWS Cloud Development Kit (CDK) es un marco de trabajo de código abierto que permite a los usuarios crear infraestructuras en la nube mediante lenguajes de programación conocidos, como Python, TypeScript, Java y C#. 

El CDK permite a los usuarios generar plantillas de CloudFormation mediante programación a través de código real, en lugar de requerir la escritura manual de plantillas JSON o YAML.

Esto significa que puedes:

  • Reutiliza la lógica mediante bucles y funciones.
  • Organiza tu infraestructura mediante módulos y clases.
  • Tu IDE proporciona herramientas para completar el código, comprobar errores y funciones de refactorización.

En esencia, el CDK gira en torno a tres conceptos principales:

  • App - El punto de entrada de tu proyecto CDK. Puede contener una o varias pilas.
  • Pila - Una unidad de despliegue que se asigna a una pila de CloudFormation. Cada pila define un conjunto de recursos que hay que crear.
  • Constructo - El componente básico de la CDK. Los constructos representan componentes de la nube como buckets S3, funciones Lambda, VPC y patrones complejos que combinan múltiples recursos.

Diagrama que ilustra la estructura de AWS CDK: una App contiene una Pila (por ejemplo, MyStack), que incluye tres construcciones -S3 Bucket, Lambda Function y VPC- conectadas en una jerarquía descendente.

Jerarquía visual de una aplicación AWS CDK

CDK vs Terraform vs CloudFormation

La tabla siguiente describe las diferencias entre las herramientas disponibles en AWS para administrar la infraestructura.

Función

AWS CDK

Terraforma

AWS CloudFormation

Apoyo lingüístico

Python, TypeScript, Java, C#

HCL (declarativo)

YAML / JSON

Nivel de abstracción

Alto (OOP + bibliotecas)

Medio

Baja

Modularidad

Fuerte (construcciones, clases)

Fuerte (módulos)

Débil (pilas anidadas)

Gestión estatal

Gestionado por CloudFormation

Gestionado por Terraform (tfstate)

Gestionado por CloudFormation

Nube múltiple

Sólo AWS

Sólo AWS

Lenguas admitidas y requisitos previos

El CDK de AWS admite varios lenguajes de programación, lo que permite a los programadores elegir con el que se sientan más cómodos:

  • TypeScript
  • Python
  • Java
  • C#/.NET
  • Go

En este tutorial, nos centraremos en Python, pero los conceptos básicos se aplican a todos los lenguajes compatibles.

Instalación y configuración

Ahora que tu entorno está listo, es hora de utilizar Python para crear tu primera aplicación AWS CDK. El comando CDK init configura toda la estructura del proyecto, incluyendo archivos, directorios y un entorno virtual, para ayudarte a empezar rápidamente.

Crear un directorio de proyecto

Abre tu terminal y ejecuta el siguiente comando para crear un nuevo directorio y navegar hasta él:

mkdir cdk_datacamp && cd cdk_datacamp

Inicializar la aplicación CDK

cdk init sample-app --language python

Esto crea un proyecto de inicio preconfigurado con un ejemplo básico que incluye:

  • Una pila de muestra (cdk_datacamp_stack)
  • Una cola SQS suscrita a un tema SNS
  • Un archivo cdk.json que configura cómo se ejecuta tu aplicación CDK
  • Un entorno virtual (en .venv) para las dependencias de Python

Cuando se complete el comando, verás una salida similar a ésta:

Salida del terminal CDK de AWS para inicializar un proyecto Python, incluyendo los pasos para crear y activar manualmente un entorno virtual, instalar los requisitos y ejecutar cdk synth.

Andamio de proyectos CDK Python 

Configuración del entorno virtual

Si el proceso cdk init no crea automáticamente un entorno virtual, puedes hacerlo manualmente:

python3 -m venv .venv
source .venv/bin/activate

Una vez activado, instala las dependencias necesarias:

pip install -r requirements.txt

Comprender los conceptos de las CDK

Antes de profundizar en el código, exploremos cómo los componentes principales de AWS CDK -apps, stacks y constructos- funcionan juntos en la práctica. Ahora que estás familiarizado con lo que representa cada uno, es esencial ver cómo interactúan para formar una infraestructura escalable y modular. 

También desglosaremos los distintos niveles de construcciones (L1, L2, L3) y examinaremos las bibliotecas CDK que lo hacen posible.

Aplicaciones, pilas y construcciones

Ahora que sabes lo que son App, Stack y Construct de las secciones anteriores, vamos a entender cómo funcionan juntos en una aplicación CDK.

Piensa que es como construir una casa:

  • La App es el proyecto global de construcción.
  • Cada Pila es como un edificio o estructura independiente en ese proyecto.
  • Cada Construcción es un componente, como paredes, puertas o tuberías, que va dentro de una pila.

En código, la relación tiene este aspecto:

# app.py

from aws_cdk import App
from my_project.my_stack import MyStack

# Initialize the CDK application
app = App()

# Instantiate the stack and add it to the app
MyStack(app, "MyFirstStack")

# Synthesize the CloudFormation template
app.synth()
# my_stack.py

from aws_cdk import Stack
from aws_cdk import aws_s3 as s3
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Define an Amazon S3 bucket with default settings
        s3.Bucket(self, "MyBucket")

Aquí, la App instanciará una Pila, que incluye Constructos como un cubo S3.

Comprender los niveles de constructo: L1, L2 y L3

En AWS CDK, las construcciones vienen en tres niveles de abstracción, lo que te da flexibilidad en función de cuánto control o simplicidad necesites.

Nivel 1 (L1) - Constructos de CloudFormation

Estos son los bloques de construcción en bruto generados directamente a partir de la especificación de AWS CloudFormation. Cada recurso de AWS en CloudFormation tiene una construcción L1 equivalente en CDK; sus nombres siempre empiezan por "Cfn".

Las construcciones L1 exponen todas las opciones de configuración posibles, pero no ofrecen abstracciones ni valores por defecto. Son ideales cuando necesitas un control total o utilizar nuevas características de AWS que aún no están cubiertas por construcciones de nivel superior.

  • Ejemplo: s3.CfnBucket

Nivel 2 (L2) - Construcciones nativas de AWS CDK

Las construcciones L2 proporcionan una abstracción de mayor nivel y más fácil de usar para los programadores que las construcciones L1. Se trata de componentes opinables con valores predeterminados sensatos y métodos incorporados que simplifican las tareas cotidianas. Están diseñadas para el uso cotidiano y ayudan a reducir la repetición de tareas sin dejar de ofrecer un buen nivel de personalización.

  • Ejemplo: s3.Bucket - Puedes crear un cubo versionado con una sola línea de código.

Nivel 3 (L3) - Construcciones de patrones

Los constructos L3 son abstracciones que agrupan múltiples recursos de AWS en patrones arquitectónicos comunes. Pueden ser proporcionados por AWS o construidos como componentes reutilizables por la comunidad o por ti. Utiliza construcciones L3 para encapsular la complejidad y reutilizar patrones de infraestructura en distintos proyectos o equipos.

  • Ejemplo: aws_s3_deployment.BucketDeployment - Combina un cubo S3 y una estrategia de despliegue para automatizar la subida de activos.

La mayoría de los programadores empiezan con construcciones L2 e introducen la L1 sólo cuando es necesario. L3 resulta útil cuando tu proyecto crece y quieres abstraer patrones repetidos en componentes reutilizables.

Bibliotecas y módulos CDK

No interactúas directamente con CloudFormation en bruto cuando construyes con AWS CDK. En su lugar, utilizas las bibliotecas modulares de CDK, que proporcionan construcciones para servicios de AWS como S3, Lambda, IAM, etc. Todos los módulos de servicio de AWS están agrupados en el paquete principal llamado aws-cdk-lib, y éstos a su vez están organizados por servicios.

Bibliotecas de uso común en Python

A continuación se indican algunas de las bibliotecas (o módulos) de aws-cdk-lib que se utilizan con más frecuencia en los proyectos de Python:

  • aws_cdk.aws_s3 - Para crear buckets S3
  • aws_cdk.aws_lambda - Para definir funciones lambda
  • aws_cdk.aws_iam - Para gestionar funciones y permisos
  • aws_cdk.aws_dynamodb - Para trabajar con tablas DynamoDB
  • aws_cdk.aws_ec2 - Para componentes de red como VPC y grupos de seguridad
  • aws_cdk.aws_sns / aws_cdk.aws_sns_subscriptions - Para temas de SNS y sus suscriptores

Estos módulos se importan sólo cuando son necesarios, manteniendo tu proyecto ligero y modular.

Cómo importar y utilizar un módulo CDK

Para utilizar un servicio específico de AWS, importa su módulo y llama a sus clases constructoras. Por ejemplo, para crear un bucket S3:

from aws_cdk import aws_s3 as s3

# Inside your stack
bucket = s3.Bucket(self, "MyBucket")

Este ejemplo utiliza la construcción L2 s3.Bucket, que incluye opciones predeterminadas como la encriptación y el versionado.

Si necesitas utilizar otro servicio, sólo tienes que importar su módulo del mismo modo:

from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam

Nota: En tu requirements.txt, normalmente sólo necesitas:

aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0

Estos dos paquetes te dan acceso a todas las construcciones CDK de AWS y a la funcionalidad principal del marco.

Crear tu primera pila CDK

Después de conocer las operaciones internas de AWS CDK, puedes poner en práctica estos conocimientos. La siguiente sección te guía a través de la construcción de una pila CDK operativa utilizando Python. Antes de implementarlos en tu cuenta de AWS, crearás una estructura de proyecto mediante código e implementarás recursos reales de AWS, como buckets de S3 y funciones de Lambda.

Andamiar un nuevo proyecto

Cuando ejecutas el comando cdk init con la bandera --language python, se establece una estructura de proyecto completa con el siguiente aspecto:

rea vista de un directorio de proyecto AWS CDK con archivos clave como app.py, cdk.json, requirements.txt, y carpetas para el código fuente cdk_datacamp y tests/unit/test_cdk_datacamp_stack.py.

Estructura de carpetas de un proyecto AWS CDK Python

El archivo app.py es donde se define la App, y el archivo cdk_datacamp_stack.py es donde escribes el código para tu Pila y Constructos.

Consejo: Puedes cambiar el nombre del archivo de pila o de la clase para que coincida con el propósito de tu aplicación, como storage_stack.py o monitoring_stack.py.

Añadir recursos AWS

Ahora vamos a añadir algunos recursos de AWS a tu pila CDK. Escribirás esto dentro del método __init__() de tu clase Stack en el archivo cdk_datacamp_stack.py.

Cubo S3

from aws_cdk import aws_s3 as s3

# Create an S3 bucket with versioning and managed encryption
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

Función lambda

from aws_cdk import aws_lambda as lambda_

# Define a Lambda function using Python 3.9 runtime
lambda_function = lambda_.Function(
    self,
    "MyFunction",
    runtime=lambda_.Runtime.PYTHON_3_9,
    handler="index.handler",
    code=lambda_.Code.from_asset("lambda")  # Load code from local folder named 'lambda'
)

Desplegar la pila

Una vez que hayas añadido tus recursos, es hora de desplegarlos en AWS.

En tu terminal, activa tu entorno virtual y ejecútalo:

cdk deploy

Así será:

  1. Sintetiza tu pila en una plantilla de CloudFormation
  2. Sube esa plantilla a AWS
  3. Aprovisiona los recursos de tu cuenta

Se te pedirá que apruebes los cambios si es la primera vez que despliegas la pila.

Tras el despliegue, puedes

  1. Abre la consola de AWS
  2. Navega hasta el servicio correspondiente (por ejemplo, S3, Lambda)
  3. Ver los recursos que CDK acaba de crear

Trabajar con constructos CDK

Las aplicaciones AWS CDK se basan en construcciones como elementos estructurales esenciales. El código de tu infraestructura será más modular, mantenible y legible cuando domines las construcciones, tanto si utilizas construcciones de servicio incorporadas como si creas tus propios patrones reutilizables.

Esta sección te enseña a utilizar construcciones L2 (de alto nivel) y a desarrollar construcciones personalizadas que reduzcan los patrones repetitivos.

Utilizar constructos L2

Las construcciones L2 son abstracciones nativas de CDK más fáciles de usar que CloudFormation en bruto (L1). Tienen valores predeterminados sensatos y seguridad de tipos, y a menudo requieren menos líneas de código para configurar un recurso de AWS.

¿Por qué utilizar construcciones L2?

  • Menos repeticiones: menos campos obligatorios en comparación con la L1
  • Código Python más legible e idiomático
  • Incluye métodos de utilidad como .add_to_role_policy() o .add_event_notification()
  • Gestiona automáticamente las dependencias entre recursos

Ejemplo: Crear un bucket S3 utilizando L2

from aws_cdk import aws_s3 as s3
# Create a versioned and encrypted S3 bucket
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

La construcción L1 equivalente, s3.CfnBucket, necesitaría que todas las propiedades se establecieran manualmente y que la configuración se definiera como dictos sin procesar, lo que es mucho menos intuitivo.

Otras construcciones comunes de L2 son

  • lambda_.Function() for AWS Lambda
  • dynamodb.Table() para DynamoDB
  • sqs.Queue() para SQS
  • sns.Topic() para SNS

Crear construcciones personalizadas

Tu infraestructura se ampliará con patrones recurrentes, como la creación de funciones Lambda con permisos y buckets S3 particulares. Las construcciones personalizadas son la solución ideal para este escenario concreto.

Las construcciones personalizadas te permiten combinar recursos relacionados en una única unidad lógica, que puede reutilizarse en pilas o proyectos.

Cuándo crear una construcción personalizada:

  • Cuando tienes más de 3 recursos que siempre se aprovisionan juntos
  • Cuando quieras encapsular lógica reutilizable
  • Cuando quieras reducir la duplicación de código entre pilas

Ejemplo: Un patrón reutilizable S3 + Lambda

from constructs import Construct
from aws_cdk import aws_s3 as s3, aws_lambda as lambda_
class StorageWithLambda(Construct):
    def __init__(self, scope: Construct, id: str) -> None:
        super().__init__(scope, id)
        # S3 bucket
        self.bucket = s3.Bucket(self, "MyBucket")

        # Lambda function
        self.function = lambda_.Function(
            self,
            "MyFunction",
            runtime=lambda_.Runtime.PYTHON_3_9,
            handler="index.handler",
            code=lambda_.Code.from_asset("lambda")
        )
        # Grant Lambda access to the S3 bucket
        self.bucket.grant_read_write(self.function)

Ahora puedes utilizar esta construcción dentro de cualquier pila como ésta:

from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")

Antes de ejecutar lo anterior, crea una carpeta llamada lambda en la raíz del proyecto y crea un archivo index.py con el siguiente contenido:

def handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from Lambda!"
    }

Consejos de reutilización

  • Prefija los archivos con construct_ o colócalos dentro de una carpeta constructs/
  • Exponer salidas como self.bucket o self.function para mayor flexibilidad
  • Mantén cada construcción centrada en una responsabilidad

Probar y sintetizar aplicaciones CDK

Después de escribir el código de tu infraestructura, es esencial comprobar qué desplegará el CDK e idealmente probar que tus pilas se comportan como se espera. El CDK de AWS proporciona herramientas para sintetizar plantillas de CloudFormation y escribir pruebas automatizadas para detectar errores de configuración antes del despliegue.

Plantillas de síntesis

El comando cdk synth genera la plantilla de CloudFormation a partir de tu código CDK.

cdk synth

Cuando ejecutes esto, el CDK:

  • Carga tu aplicación (a través de app.py)
  • Resuelve todas las construcciones y pilas
  • Genera plantillas de CloudFormation YAML/JSON sin procesar

plantilla sintetizada de AWS CloudFormation con recursos que incluyen una cola SQS, una política de cola que permite a SNS enviar mensajes y un recurso de suscripción SNS que hace referencia a la cola.

Plantilla CloudFormation sintetizada 

Por defecto, la salida va a tu terminal, pero también puedes enviarla a un archivo si es necesario:

cdk synth > template.yaml

Esto es útil cuando:

  • Quieres inspeccionar la plantilla real antes de desplegarla
  • Estás depurando la estructura de una pila
  • Estás compartiendo la plantilla con equipos que no utilizan CDK

Infraestructura de pruebas

Aunque probar la infraestructura como código puede sonar inusual, es beneficioso, especialmente cuando tus pilas son grandes o incluyen lógica condicional, bucles o construcciones reutilizables.

El CDK de AWS ofrece el módulo de aserciones para probar las pilas sintetizadas.

Escribir una prueba sencilla con pytest

Aquí tienes un ejemplo de prueba que comprueba si un recurso específico (como un bucket S3) está incluido en la pila:

# test/test_cdk_datacamp_stack.py
import aws_cdk as cdk
from aws_cdk.assertions import Template
from cdk_datacamp.cdk_datacamp_stack import CdkDatacampStack
def test_s3_bucket_created():
    app = cdk.App()
    stack = CdkDatacampStack(app, "TestStack")
    template = Template.from_stack(stack)
    # Assert that an S3 bucket exists
    template.resource_count_is("AWS::S3::Bucket", 1)

Para realizar las pruebas, asegúrate de que pytest está instalado:

pip install -U pytest

Entonces corre:

pytest

Si todo pasa, verás una marca de verificación verde. Si no es así, el resultado de la prueba te dirá lo que falta.

Salida de pytest en un entorno Linux utilizando Python 3.11.11 y pytest 8.3.5, que muestra los tres casos de prueba superados con indicadores verdes y un tiempo de ejecución de 2,89 segundos.      

Salida de Pytest que muestra la ejecución correcta de todos los casos de prueba para la pila CDK de AWS

También puedes incluir la validación en tu pila CDK. Las pruebas de validación son comprobaciones en tiempo de ejecución dentro de tu código de construcción o apilamiento que validan las entradas antes de que se produzca el despliegue. Ayudan a detectar errores de configuración o a imponer restricciones en las primeras fases del ciclo de vida del desarrollo.

Digamos que queremos pasar el bucket_name como variable de contexto, pero queremos validarlo:

  • El nombre del cubo no está vacío
  • Cumple las normas de denominación del S3 (por ejemplo, sólo en minúsculas)

Crea un archivo llamado test/test_storage_with_lambda.py y añade lo siguiente:

import pytest
from aws_cdk import App, Stack
from cdk_datacamp.storage_with_lambda import StorageWithLambda

def test_missing_bucket_name():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="bucket_name is required"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name=None)

def test_bucket_name_uppercase():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="must be lowercase"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name="InvalidName")

 Para probar la validación, ejecuta el siguiente comando:

test/test_storage_with_lambda.py

Salida de pytest en un entorno Linux utilizando Python 3.11.11 y pytest 8.3.5, mostrando los tres casos de prueba superados con indicadores verdes.        

Salida de Pytest que muestra la ejecución correcta de todos los casos de prueba para la pila CDK de AWS

Cuándo utilizar las pruebas:

  • Estás creando construcciones o patrones reutilizables.
  • La realización de pruebas sirve para establecer requisitos técnicos estándar entre los miembros del equipo.
  • Quieres detectar regresiones o cambios no intencionados durante el CI/CD.

¿Quieres reforzar tus conocimientos sobre CDK en una entrevista? Estas preguntas de entrevista sobre AWS DevOps pueden ayudarte a prepararte.

Buenas prácticas y consejos para trabajar con el CDK de AWS

Después de dominar la creación y despliegue de la pila CDK, debes seguir las mejores prácticas para mantener el código de tu infraestructura limpio, seguro y escalable. Esta sección tratará sobre cómo estructurar grandes proyectos, gestionar correctamente la seguridad e integrar CDK en las canalizaciones CI/CD.

Organizar grandes proyectos

A medida que crece tu aplicación CDK, resulta esencial organizar el código en unidades manejables.

Utiliza pilas múltiples

Divide tu infraestructura por intereses. Por ejemplo:

  • RedStack: VPCs, subredes, grupos de seguridad
  • ComputeStack: EC2, Lambda
  • StorageStack: S3, DynamoDB

Esto te permite desplegar, probar o destruir partes de tu infraestructura de forma independiente. He aquí cómo se puede incluir en app.py:

network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")

También puedes pasar recursos entre pilas utilizando salidas o referencias.

Crear construcciones anidadas reutilizables

Encapsula los recursos relacionados (como una Lambda y sus permisos) en una construcción personalizada, como hiciste con StorageWithLambda. Esto mejora la legibilidad y la reutilización entre pilas o aplicaciones.

Utilizar la configuración específica del entorno

Soporta múltiples entornos (dev, staging, prod) utilizando:

  • cdk.json con valores de contexto
  • Anulaciones CLI: cdk deploy -c env=prod
  • Lógica condicional en tus pilas
env = app.node.try_get_context("env")
if env == "prod":
    bucket_name = "mycompany-prod-logs"

Seguridad y permisos

Cualquier proyecto de infraestructura debe dar prioridad a la seguridad durante los procesos de despliegue automatizado del CDK de AWS. La siguiente sección demuestra la gestión segura de recursos IAM a través de los principios del mínimo privilegio.

Definir roles IAM en lugar de utilizar los predeterminados

Las construcciones CDK, que incluyen tareas Lambda o ECS, crearán automáticamente roles IAM. Aunque es cómodo, puede limitar tu control sobre los permisos y los nombres.

En lugar de eso, define las funciones explícitamente:

from aws_cdk import aws_iam as iam

execution_role = iam.Role(
    self,
    "LambdaExecutionRole",
    assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
    description="Custom role for Lambda with least privilege",
    managed_policies=[
        iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole")
    ]
)

Este rol sólo permite el registro y nada más por defecto.

Aplicar el principio del menor privilegio

Evita utilizar "*" en actions o resources a menos que sea absolutamente necesario.

Ejemplo:

lambda_fn.add_to_role_policy(
    iam.PolicyStatement(
        actions=["*"],
        resources=["*"]
    )
)

También puedes utilizar subvenciones para recursos específicos cuando estén disponibles:

bucket.grant_read(lambda_fn)

Esto genera automáticamente la política necesaria con acceso de alcance al bucket S3.

Utiliza políticas gestionadas cuando sea posible

Las políticas gestionadas por AWS simplifican el mantenimiento y reducen la posibilidad de errores.

iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")

Puedes adjuntarlas a roles personalizados para servicios como ECS, Lote o Funciones por Pasos.

Integración CI/CD

El CDK de AWS ofrece una potencia excepcional gracias a su capacidad para integrarse con las canalizaciones CI/CD contemporáneas. CDK admite la entrega automatizada de infraestructura mediante el despliegue de código controlado por versiones, que funciona con GitHub, GitLab y servicios nativos de AWS, incluido CodePipeline. El sistema disminuye los errores humanos al tiempo que acorta los ciclos de retroalimentación y permite el despliegue en múltiples entornos.

Acciones en GitHub: Automatizar las implantaciones de CDK

Puedes utilizar las Acciones de GitHub para sintetizar, diferenciar, probar y desplegar pilas CDK en cada push o pull request.

Echa un vistazo a este .github/workflows/deploy.yml:

name: Deploy CDK App

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-python@v4
        with:
          python-version: 3.11

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          npm install -g aws-cdk

      - name: Run unit tests
        run: pytest

      - name: CDK Synth
        run: cdk synth -c environment=prod

      - name: Deploy to AWS
        run: cdk deploy --require-approval never
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

Utiliza cdk diff en los PR para previsualizar los cambios infra antes de fusionarlos.

Canalizaciones CDK: CDK nativo CI/CD con CodePipeline

Para despliegues totalmente gestionados en AWS, CDK proporciona un módulo llamado aws_cdk.pipelines, que te permite definir toda tu canalización CI/CD como código, igual que la infraestructura.

He aquí un ejemplo simplificado:

from aws_cdk import pipelines, SecretValue, Stack
from constructs import Construct
from my_app_stage import MyAppStage  # replace with your actual stage import

class PipelineStack(Stack):
    def __init__(
        self,
        scope: Construct,
        construct_id: str,
        **kwargs
    ) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Define the source of the pipeline from a GitHub repository
        source = pipelines.CodePipelineSource.git_hub(
            repo_string="your-org/your-repo",  # GitHub org/repo
            branch="main",
            authentication=SecretValue.secrets_manager("GITHUB_TOKEN")
        )

        # Define the CodePipeline and its synthesis step
        pipeline = pipelines.CodePipeline(
            self,
            "MyAppPipeline",
            synth=pipelines.ShellStep(
                "Synth",
                input=source,
                commands=[
                    "pip install -r requirements.txt",
                    "npm install -g aws-cdk",
                    "cdk synth"
                ]
            )
        )

        # Add an application stage (e.g., production deployment)
        pipeline.add_stage(
            MyAppStage(self, "ProdStage")
        )

En el código anterior:

  • SecretValue.secrets_manager("GITHUB_TOKEN") extrae de forma segura tu token de GitHub del Gestor de Secretos.
  • MyAppStage debe ser una clase que extienda Stage y envuelva tus pilas CDK reales.

Si estás desplegando sistemas de machine learning, la integración de CDK con las prácticas de despliegue continuo se trata en nuestro curso CI/CD para machine learning.

Conclusión

Este tutorial te ha enseñado a construir y desplegar infraestructuras en la nube en Python a través de las operaciones del Kit de Desarrollo en la Nube (CDK) de AWS. Aprendiste a hacerlo:

  • Crea tu primera pila CDK.
  • Define y valida los buckets de S3 y las funciones Lambda como recursos.
  • Organiza un proyecto mediante construcciones personalizadas y patrones multipila.
  • Aplica las mejores prácticas de seguridad mediante el principio del mínimo privilegio.
  • Automatiza los despliegues combinando GitHub Actions con CDK Pipelines.
  • Escribe pruebas para validar la lógica de tu infraestructura.

Ahora que ya has desplegado tu primera aplicación CDK, aquí tienes algunas formas de subir de nivel:

  • Utilizar entornos parametrizados para dev/staging/prod
  • Añade alarmas CloudWatch, API Gateway o funciones de paso
  • Explora construcciones CDK como aws_s3_deployment, aws_ecs_patterns, y cdk.pipelines
  • Convierte tus construcciones en una biblioteca interna de Python para reutilizarlas

Para seguir aprendiendo y construyendo¡el curso Introducción a AWS Boto en Python!

Preguntas frecuentes

¿Qué es AWS CDK y en qué se diferencia de CloudFormation o Terraform?

AWS CDK te permite definir la infraestructura de la nube utilizando lenguajes de programación como Python, mientras que CloudFormation y Terraform se basan en JSON/YAML o HCL. El CDK ofrece una mayor abstracción y reutilización mediante constructos.

¿Necesito conocer CloudFormation para utilizar AWS CDK?

No, CDK abstrae la mayor parte de la complejidad de CloudFormation. Sin embargo, entender CloudFormation ayuda cuando se utilizan construcciones de nivel inferior o se solucionan problemas de despliegue.

¿Puedo implementar varios entornos (por ejemplo, dev, prod) con AWS CDK?

Sí. CDK admite la configuración específica del entorno mediante valores de contexto y banderas de la CLI como cdk deploy -c env=prod.

¿Cómo pruebo el código de mi infraestructura CDK?

Puedes utilizar pytest junto con las aserciones de CDK y el módulo de plantillas para escribir pruebas unitarias que verifiquen los recursos y configuraciones de tu pila antes del despliegue.

¿Qué ocurre entre bastidores cuando ejecuto cdk deploy?

cdk deploy sintetiza tu código Python en una plantilla de CloudFormation, la sube a AWS y aprovisiona los recursos definidos en tu cuenta.


Rahul Sharma's photo
Author
Rahul Sharma
LinkedIn
Twitter

Rahul Sharma es embajador de AWS, arquitecto DevOps y bloguero técnico especializado en computación en la nube, prácticas DevOps y tecnologías de código abierto. Con experiencia en AWS, Kubernetes y Terraform, simplifica conceptos complejos para estudiantes y profesionales a través de atractivos artículos y tutoriales. A Rahul le apasiona resolver los retos de DevOps y compartir conocimientos para capacitar a la comunidad tecnológica.

Temas

Aprende más sobre AWS con estos cursos

Curso

AWS Concepts

2 h
29K
Discover the world of Amazon Web Services (AWS) and understand why it's at the forefront of cloud computing.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Los 13 mejores proyectos de AWS: De principiante a profesional

Explora 13 proyectos prácticos de AWS para todos los niveles. Mejora tus conocimientos sobre la nube con aplicaciones prácticas del mundo real y la orientación de expertos.
Joleen Bothma's photo

Joleen Bothma

12 min

blog

AWS Certified Cloud Practitioner: guía completa

Comprende la certificación y el examen AWS Certified Cloud Practitioner con nuestra guía completa. Descubre consejos, recursos y estrategias para garantizar tu éxito.
Srujana Maddula's photo

Srujana Maddula

13 min

blog

Cómo aprender Python desde cero en 2024: Guía del experto

Descubre cómo aprender Python, sus aplicaciones y la demanda de conocimientos de Python. Comienza hoy tu andadura en Python ​con nuestra guía completa.
Matt Crabtree's photo

Matt Crabtree

15 min

Tutorial

Primeros pasos con AWS Athena: Guía práctica para principiantes

Esta guía práctica te ayudará a empezar a utilizar AWS Athena. Explora su arquitectura y características y aprende a consultar datos en Amazon S3 utilizando SQL.
Tim Lu's photo

Tim Lu

15 min

Tutorial

Desarrollo de backend en Python: Guía completa para principiantes

Esta completa guía te enseña los fundamentos del desarrollo backend en Python. Aprende conceptos básicos, marcos de trabajo y buenas prácticas para empezar a crear aplicaciones web.
Oluseye Jeremiah's photo

Oluseye Jeremiah

15 min

Tutorial

Tutorial de pandas en Python: La guía definitiva para principiantes

¿Estás preparado para comenzar tu viaje de pandas? Aquí tienes una guía paso a paso sobre cómo empezar.
Vidhi Chugh's photo

Vidhi Chugh

15 min

Ver másVer más