Curso
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.
- Accede a tu cuenta de AWS.
- Abre la Consola IAM.
- Crea un nuevo usuario: puedes llamarlo algo así como "datacamp-cdk".
- Selecciona Acceso programático.
- Haz clic en . Siguiente: Permisos.
- Elige Adjuntar directamente las políticas existentes y marca AdministradorAcceso.
- 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.
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í |
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:
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 S3aws_cdk.aws_lambda
- Para definir funciones lambdaaws_cdk.aws_iam
- Para gestionar funciones y permisosaws_cdk.aws_dynamodb
- Para trabajar con tablas DynamoDBaws_cdk.aws_ec2
- Para componentes de red como VPC y grupos de seguridadaws_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:
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á:
- Sintetiza tu pila en una plantilla de CloudFormation
- Sube esa plantilla a AWS
- 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
- Abre la consola de AWS
- Navega hasta el servicio correspondiente (por ejemplo, S3, Lambda)
- 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 Lambdadynamodb.Table()
para DynamoDBsqs.Queue()
para SQSsns.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 carpetaconstructs/
- Exponer salidas como
self.bucket
oself.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 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 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 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 extiendaStage
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
, ycdk.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 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.