Introducción a AWS CDK

GUÍA DE INTRODUCCIÓN

Módulo 3: Crear su primer proyecto de AWS CDK

En este módulo, creará infraestructura mediante el kit de desarrollo de la nube (CDK) de AWS.

Introducción

En esta guía, utilizaremos la CLI de AWS CDK para crear un nuevo proyecto de infraestructura mediante TypeScript. También descubriremos cómo escribir un recurso sencillo y cómo sintetizar e implementar su código de CDK. La sintetización es la forma en la que CDK convierte su código de infraestructura en plantillas de AWS CloudFormation.

Lo que aprenderá

  • Creación de un nuevo proyecto de CDK con TypeScript.
  • Escritura de un recurso sencillo en CDK (VPC).
  • Sintetización de su código de CDK en una plantilla de CloudFormation.
  • Implementación de la infraestructura en su cuenta de AWS.

 Tiempo de realización

15 minutos

 Requisitos previos del módulo

  • Una cuenta de AWS con acceso de nivel de administrador**
  • Navegador recomendado: la última versión de Chrome o Firefox

[**] Es posible que las cuentas creadas en las últimas 24 horas aún no tengan acceso a los servicios necesarios para este tutorial.

Implementación

Crear un nuevo proyecto de CDK

Para crear un nuevo proyecto de CDK, utilizaremos la CLI de CDK. Para comenzar, cree un directorio vacío en su sistema para realizar modificaciones. Ahora, utilizaremos cdk init para crear un nuevo proyecto de CDK de TypeScript:

mkdir cdk-demo
cd cdk-demo
cdk init --language typescript

Esto creará la estructura de carpetas e instalará algunos de los módulos necesarios para un proyecto de CDK de TypeScript. El resultado debería verse así:

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated sane@4.1.0: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added
npm notice
npm notice New minor version of npm available! 7.19.0 -> 7.20.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.20.1
npm notice Run npm install -g npm@7.20.1 to update!
npm notice
✅ All done!

También le brinda los comandos necesarios para ayudarle a comenzar con su proyecto de CDK. Ahora estamos preparados para escribir nuestro primer código de CDK y crear infraestructura.

Creación de infraestructura

Para comenzar a crear un proyecto, un punto de partida común es crear una red virtual aislada lógicamente que usted defina, lo que se conoce como una Amazon Virtual Private Cloud (VPC). Antes de crear nuestra primera VPC, necesitamos comprender los archivos que el comando cdk init ha creado.

Crear e implementar su aplicación de CDK

├── bin
│   └── cdk-demo.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── cdk-demo-stack.ts
├── package.json
├── package-lock.json
├── README.md
├── test
│   └── cdk-demo.test.ts
└── tsconfig.json

Estos son algunos de los archivos importantes y su uso:

  • bin/cdk-project.ts: el punto de entrada para su aplicación de CDK. Cargará o creará todas las pilas que defina bajo lib/*
  • lib/cdk-project-stack.ts: aquí es donde se define su pila de aplicaciones de CDK principal. Sus recursos y propiedades pueden ir aquí.
  • package.json: aquí define las dependencias de su proyecto así como información adicional y scripts de creación (npm buildnpm testnpm watch).
  • cdk.json: este archivo le explica al conjunto de herramientas cómo ejecutar su aplicación, además de algunas configuraciones y parámetros adicionales relacionados con el CDK y su proyecto.

En el caso de esta guía, nos centraremos en los archivos lib/cdk-demo.ts y bin/cdk-demo.ts para crear nuestra infraestructura. Vamos a agregar código.

Definir unas cuantas cosas en nuestra aplicación

Antes de que definamos nuestra VPC en la pila principal, necesitamos asegurarnos de que la implementación se realiza en la cuenta y región correctas. Aunque el CDK extraerá esta información de su configuración aws cli local, es mejor configurarla de manera manual en su código de CDK para evitar valores incorrectos cuando dicha configuración cambie. En el caso de esta guía, es necesario debido a la configuración que definiremos en nuestra VPC. Si no lo especifica, la pila funcionará con cualquier entorno, pero algunas características y búsquedas contextuales no funcionarán. Para obtener más información, consulte entornos en la documentación.

Modifique su pila bin/cdk-demo.ts para que se asemeje a esta. Asegúrese de sustituir su ID de cuenta de AWS con el número correcto y escoger la región correcta. Le recomendamos que seleccione us-east-1 o eu-west-1 para esta guía.

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { CdkDemoStack } from '../lib/cdk-demo-stack';

const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
  env: { account: '123456789012', region: 'eu-west-1' },

});

Ahora está preparado para escribir su primer recurso.

Código para la VPC

Crearemos una VPC, con dos subredes de acceso público, distribuida en dos zonas de disponibilidad. Antes de que comencemos a escribir el código, es necesario explicar e instalar los módulos de la biblioteca de constructos. Los diferentes servicios se empaquetan en módulos para que pueda agregar solamente las dependencias necesarias para la infraestructura que está aprovisionando. Los módulos pueden ser para un único servicio, como AWS Amplify, o para varios servicios, como Amazon EC2. En el caso de esta guía, necesitaremos el módulo de Amazon EC2, que también incluye compatibilidad para VPC de AWS.

Para instalar el módulo, utilizaremos npm. Ejecute el siguiente comando en el directorio de su proyecto:

npm install @aws-cdk/aws-ec2

Esta acción instalará todos los módulos necesarios con los que necesitamos trabajar. Si examina package.json, verá que también se agregó allí.

Ahora, estamos listos para crear nuestra VPC. Abra su definición de pila en lib/cdk-demo.ts. Cuando abra por primera vez el archivos debería ver algo como esto:

import * as cdk from '@aws-cdk/core';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

Este es el esqueleto de nuestro proyecto. Si ejecutase el CDK ahora, no se crearían recursos puesto que aún no hemos definido ninguno. Para comenzar con la VPC, necesitamos importar el módulo instalado, y referenciar los módulos de código dentro; importaremos la Vpc y la clase SubnetType.

import * as cdk from '@aws-cdk/core';

// CHANGE: This is where you import the classes from the module:
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

Al crear una VPC, hay un número de propiedades que podemos configurar para adaptarla a nuestras necesidades. De manera predeterminada, se creará una VPC en 3 zonas de disponibilidad (AZ), con subredes públicas y privadas (con una única gateway de Internet y 3 gateways NAT). En el caso de esta guía, solo queremos crear una configuración muy sencilla que abarque 2 AZ, cada una con una subred pública. Lea este documento para obtener una explicación más detallada de las diferencias. 

Para crear nuestra VPC, especificaremos dos AZ y los detalles para crear una subred pública tal como se muestra a continuación:

import * as cdk from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    // CHANGE: We have created the vpc object from the Vpc class.
    const vpc = new Vpc(this, 'MainVpc',{
    
    // CHANGE: this is where we define how many AZs to use
    maxAzs: 2,
      
   // CHANGE: We define a single subnet configuration per AZ.
      subnetConfiguration:  [
        {
          // CHANGE: this is it's CIDR mask so 255.255.255.0
          cidrMask: 24,

          // CHANGE: a name for each of these subnets
          name: 'public-subnet',

          // CHANGE: and the subnet type to be used - here we will have
          // a public subnet. There are other options available here.
          subnetType: SubnetType.PUBLIC
        },
      ]
    });
  }
}

Ahora estamos listos para implementar este cambio de infraestructura en nuestra cuenta.

Hora de implementar

Es el momento de probar nuestra implementación. Para comprobar si el código es válido, puede ejecutar una compilación npm que compilará TypeScript en JavaScript. Si el proceso se lleva a cabo correctamente, puede ejecutar el comando de implementación:

cdk deploy

Esto compilará su TypeScript en JavaScript y creará una conjunto de cambios de CloudFormation para implementar este cambio. CDK lo administra todo, además de cargar el archivo de plantillas en S3 y utilizar CloudFormation para ejecutarlo. Debería ver un resultado similar al siguiente:

# cdk deploy
CdkDemoStack: deploying...
CdkDemoStack: creating CloudFormation changeset...
[··························································] (0/13)

3:50:17 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack            | CdkDemoStack
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::InternetGateway             | MainVpc/IGW
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC                         | MainVpc
3:50:22 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata                    | CDKMetadata/Default

Tras unos cuantos minutos, debería obtener una marca de verificación verde junto con un ARN (nombre de recurso de Amazon) de su pila de CloudFormation recién creada. Su nueva VPC ha sido implementada y está lista para utilizarse.

Eliminar recursos (opcional)

La VPC creada en esta guía no tendrá ningún costo al mes, pero hay una cuota que limita cada región en una cuenta y solo permite 5 VPC; puede aumentar este límite si lo necesita a través de un ticket de soporte. Si desea eliminar sus recursos recién creados, puede ejecutar el comando cdk destroy, el cual eliminará todos los recursos mediante la pila de CloudFormation creada antes.

cdk destroy

Debería recibir el siguiente mensaje emergente. Tras presionar y e Intro, el comando empezará a eliminar toda la infraestructura y brindará actualizaciones. Una vez completado, verá lo siguiente:

Are you sure you want to delete: CdkEcsInfraStack (y/n)? y
CdkEcsInfraStack: destroying...

✅  CdkEcsInfraStack: destroyed

Conclusión

¡Felicitaciones! Ha completado la guía Introducción a AWS CDK. En esta guía hemos creado nuestro primer proyecto de AWS CDK en TypeScript mediante la creación de una VPC. Hemos visto cómo inicializar un nuevo proyecto de CDK y utilizarlo para crear esta infraestructura. Este código de CDK y la VPC se utilizarán en futuras guías. Le recomendamos que consulte la guía sobre cómo implementar su primera aplicación web. 

Si desea profundizar más en conceptos como estructuras de carpetas, constructos, pilas y aplicaciones, le recomendamos que consulte la documentación

Háganos saber su opinión.

Agradecemos sus comentarios
Nos alegra que esta página le haya ayudado. ¿Le gustaría compartir detalles adicionales para ayudarnos a seguir mejorando?
Cerrar
Agradecemos sus comentarios
Lamentamos que esta página no le haya ayudado. ¿Le gustaría compartir detalles adicionales para ayudarnos a seguir mejorando?
Cerrar