Trabajar con la biblioteca de AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Esta es la guía para AWS CDK desarrolladores de la versión 2. La CDK versión anterior entró en mantenimiento el 1 de junio de 2022 y finalizó el soporte el 1 de junio de 2023.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Trabajar con la biblioteca de AWS CDK

Importe y utilice la biblioteca de AWS Cloud Development Kit (AWS CDK) para definir su infraestructura de Nube de AWS con un lenguaje de programación compatible.

Importar la Biblioteca de AWS CDK

A menudo se hace referencia a la Biblioteca de AWS CDK por su nombre de paquete TypeScript: aws-cdk-lib. El nombre real del paquete varía según el idioma. El siguiente es un ejemplo de cómo instalar e importar la biblioteca de CDK:

TypeScript
Instalación npm install aws-cdk-lib
Import import * as cdk from 'aws-cdk-lib';
JavaScript
Instalación npm install aws-cdk-lib
Import const cdk = require('aws-cdk-lib');
Python
Instalación python -m pip install aws-cdk-lib
Import import aws_cdk as cdk
Java
En pom.xml, agregue Group software.amazon.awscdk; artifact aws-cdk-lib
Import import software.amazon.awscdk.App;
C#
Instalación dotnet add package Amazon.CDK.Lib
Import using Amazon.CDK;
Go
Instalación go get github.com/aws/aws-cdk-go/awscdk/v2
Import
import ( "github.com/aws/aws-cdk-go/awscdk/v2" )

La clase base construct y el código de soporte están en la biblioteca constructs. Los constructos experimentales, en los que la API aún se encuentra en proceso de perfeccionamiento, se distribuyen como módulos separados.

Uso de la referencia de la API de AWS CDK

Utilice la referencia de la API de AWS CDK a medida que desarrolla con AWS CDK.

El material de referencia de cada módulo se divide en las siguientes secciones.

  • Descripción general: material introductorio que necesitará conocer para trabajar con el servicio en AWS CDK, que incluye conceptos y ejemplos.

  • Constructos: clases de biblioteca que representan uno o más recursos concretos de AWS. Se trata de los recursos “seleccionados” (L2) o patrones (recursos L3) que proporcionan una interfaz de alto nivel con valores predeterminados en buen estado.

  • Clases: clases que no son de constructos y que proporcionan la funcionalidad utilizada por los constructos del módulo.

  • Estructuras: estructuras de datos (grupos de atributos) que definen la estructura de los valores compuestos, como las propiedades (el argumento props de los constructos) y las opciones.

  • Interfaces: las interfaces, cuyos nombres comienzan todos por “I”, definen la funcionalidad mínima absoluta para el constructo correspondiente u otra clase. El CDK usa interfaces de constructos para representar los recursos de AWS que están definidos fuera de la aplicación AWS CDK y a los que se hace referencia mediante métodos como Bucket.fromBucketArn().

  • Enumeraciones: colecciones de valores con nombre que se utilizan para especificar determinados parámetros de constructos. El uso de un valor enumerado permite al CDK comprobar la validez de estos valores durante la síntesis.

  • Recursos de CloudFormation: estos constructos L1, cuyos nombres comienzan por “Cfn”, representan exactamente los recursos definidos en la especificación de CloudFormation. Se generan de forma automática a partir de esa especificación con cada versión del CDK. Cada constructo L2 o L3 encapsula uno o más recursos de CloudFormation.

  • Tipos de propiedades de CloudFormation: conjunto de valores con nombre que definen las propiedades de cada recurso de CloudFormation.

Comparación de las interfaces con las clases de constructo

El AWS CDK utiliza las interfaces de una manera específica que puede no resultar obvia incluso si está familiarizado con las interfaces como concepto de programación.

El AWS CDK admite el uso de recursos definidos fuera de las aplicaciones CDK mediante métodos como Bucket.fromBucketArn(). Los recursos externos no se pueden modificar y es posible que no tengan todas las funciones disponibles con los recursos definidos en su aplicación CDK que utiliza, por ejemplo, la clase Bucket. Por lo tanto, las interfaces representan la funcionalidad mínima disponible en el CDK para un tipo de recurso de AWS determinado, incluidos los recursos externos.

Por lo tanto, al crear instancias de recursos en la aplicación CDK, siempre debe utilizar clases concretas, como Bucket. Cuando especifique el tipo de argumento que va a aceptar en uno de sus propios constructos, utilice un tipo de interfaz como IBucket si está preparado para trabajar con recursos externos (es decir, no necesitará cambiarlos). Si necesita un constructo definido por CDK, especifique el tipo más general que pueda utilizar.

Algunas interfaces son versiones mínimas de propiedades o grupos de opciones asociados a clases específicas, en lugar de constructos. Estas interfaces pueden resultar útiles a la hora de subclasificar para aceptar argumentos que pasará a su clase principal. Si necesita una o más propiedades adicionales, querrá implementarla o derivarla de esta interfaz o de un tipo más específico.

nota

Algunos lenguajes de programación compatibles con AWS CDK no tienen ninguna característica de interfaz. En estos lenguajes, las interfaces son simplemente clases normales. Puede identificarlos por sus nombres, que siguen el patrón de una “I” inicial seguida del nombre de algún otro constructo (por ejemplo, IBucket). Se aplican las mismas reglas.

Administración de las dependencias

Las dependencias de la aplicación o biblioteca de AWS CDK se administran mediante herramientas de administración de paquetes. A menudo, estas herramientas se utilizan con los lenguajes de programación.

Por lo general, AWS CDK es compatible con la herramienta de administración de paquetes estándar u oficial del lenguaje, si existe. De lo contrario, AWS CDK será compatible con la herramienta más popular o más compatible del lenguaje. Es posible que también pueda usar otras herramientas, especialmente si funcionan con las herramientas compatibles. Sin embargo, el soporte oficial para otras herramientas es limitado.

AWS CDK admite los siguientes administradores de paquetes:

Idioma Herramienta de administración de paquetes compatible
TypeScript/JavaScript NPM (Node Package Manager) o Yarn
Python PIP (instalador de paquetes para Python)
Java Maven
C# NuGet
Go Módulos Go

Al crear un nuevo proyecto mediante el comando cdk init de la CLI de AWS CDK, las dependencias de las bibliotecas principales y los constructos estables del CDK se especifican de forma automática.

Para obtener más información acerca de cómo administrar las dependencias de los lenguajes de programación compatibles, consulte lo siguiente:

Comparación de AWS CDK en TypeScript con otros lenguajes

TypeScript fue el primer lenguaje compatible para el desarrollo de aplicaciones AWS CDK. Por lo tanto, una cantidad sustancial de código de CDK de ejemplo está escrita en TypeScript. Si desarrolla en otro lenguaje, puede ser útil comparar la forma en que se implementa el código de AWS CDK en TypeScript en comparación con el lenguaje que elija. Esto puede ayudarlo a usar los ejemplos de toda la documentación.

Importación de un módulo

TypeScript/JavaScript

TypeScript admite la importación de un espacio de nombres completo o de objetos individuales desde un espacio de nombres. Cada espacio de nombres incluye constructos y otras clases para su uso con un servicio de AWS determinado.

// Import main CDK library as cdk import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS // Import specific core CDK classes import { Stack, App } from 'aws-cdk-lib'; const { Stack, App } = require('aws-cdk-lib'); // Import AWS S3 namespace as s3 into current namespace import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript // Having imported cdk already as above, this is also valid const s3 = cdk.aws_s3; // Now use s3 to access the S3 types const bucket = s3.Bucket(...); // Selective import of s3.Bucket import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript // Now use Bucket to instantiate an S3 bucket const bucket = Bucket(...);
Python

Al igual que TypeScript, Python admite la importación de módulos con espacios de nombres y la importación selectiva. Los espacios de nombres en Python se parecen a aws_cdk.xxx, donde xxx representa el nombre de un servicio de AWS, como s3 para Amazon S3. (Amazon S3 se utiliza en estos ejemplos).

# Import main CDK library as cdk import aws_cdk as cdk # Selective import of specific core classes from aws_cdk import Stack, App # Import entire module as s3 into current namespace import aws_cdk.aws_s3 as s3 # s3 can now be used to access classes it contains bucket = s3.Bucket(...) # Selective import of s3.Bucket into current namespace from aws_cdk.s3 import Bucket # Bucket can now be used to instantiate a bucket bucket = Bucket(...)
Java

Las importaciones de Java funcionan de forma diferente a las de TypeScript. Cada instrucción de importación importa un único nombre de clase desde un paquete determinado o todas las clases definidas en ese paquete (mediante *). Se puede acceder a las clases con el nombre de la clase en sí mismo si se importó o con el nombre de la clase cualificada, incluido su paquete.

Las bibliotecas reciben un nombre como software.amazon.awscdk.services.xxx para la Biblioteca de constructos de AWS (la biblioteca principal es software.amazon.awscdk). El identificador de grupo de Maven para los paquetes de AWS CDK es software.amazon.awscdk.

// Make certain core classes available import software.amazon.awscdk.Stack; import software.amazon.awscdk.App; // Make all Amazon S3 construct library classes available import software.amazon.awscdk.services.s3.*; // Make only Bucket and EventType classes available import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.s3.EventType; // An imported class may now be accessed using the simple class name (assuming that name // does not conflict with another class) Bucket bucket = Bucket.Builder.create(...).build(); // We can always use the qualified name of a class (including its package) even without an // import directive software.amazon.awscdk.services.s3.Bucket bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build(); // Java 10 or later can use var keyword to avoid typing the type twice var bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build();
C#

En C#, los tipos se importan con la directiva using. Existen dos estilos. El primero otorga acceso a todos los tipos en el espacio de nombres especificado mediante sus nombres simples. El segundo puede hacer referencia al propio espacio de nombres mediante un alias.

Los paquetes reciben un nombre como Amazon.CDK.AWS.xxx para los paquetes de la Biblioteca de constructos de AWS. (El módulo principal es Amazon.CDK.)

// Make CDK base classes available under cdk using cdk = Amazon.CDK; // Make all Amazon S3 construct library classes available using Amazon.CDK.AWS.S3; // Now we can access any S3 type using its name var bucket = new Bucket(...); // Import the S3 namespace under an alias using s3 = Amazon.CDK.AWS.S3; // Now we can access an S3 type through the namespace alias var bucket = new s3.Bucket(...); // We can always use the qualified name of a type (including its namespace) even without a // using directive var bucket = new Amazon.CDK.AWS.S3.Bucket(...)
Go

Cada módulo de la Biblioteca de constructos de AWSse proporciona como un paquete Go.

import ( "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) // now instantiate a bucket bucket := awss3.NewBucket(...) // use aliases for brevity/clarity import ( cdk "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) bucket := s3.NewBucket(...)

Crear una instancia de constructo

Las clases de constructos de AWS CDK tienen el mismo nombre en todos los lenguajes admitidos. La mayoría de los lenguajes usan la palabra clave new para crear instancias de una clase (Python y Go no lo hacen). Además, en la mayoría de los lenguajes, la palabra clave this se refiere a la instancia actual. (Python utiliza self por convención). Debería pasar una referencia a la instancia actual como el parámetro scope a cada constructo que cree.

El tercer argumento de un constructo de AWS CDK es props un objeto que contiene los atributos necesarios para crear el constructo. Este argumento puede ser opcional, pero cuando es necesario, los lenguajes compatibles lo manejan de formas idiomáticas. Los nombres de los atributos también se adaptan a los patrones de nomenclatura estándar del lenguaje.

TypeScript/JavaScript
// Instantiate default Bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket'); // Instantiate Bucket with bucketName and versioned properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { bucketName: 'amzn-s3-demo-bucket', versioned: true, }); // Instantiate Bucket with websiteRedirect, which has its own sub-properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { websiteRedirect: {host: 'aws.amazon.com'}});
Python

Python no usa una palabra clave new al crear instancias de una clase. El argumento de propiedades se representa mediante argumentos de palabras clave y los argumentos se nombran mediante snake_case.

Si un valor de props es en sí mismo un grupo de atributos, se representa mediante una clase con el nombre de la propiedad que acepta argumentos de palabras clave para las subpropiedades.

En Python, la instancia actual se pasa a los métodos como el primer argumento, que se denomina self por convención.

# Instantiate default Bucket bucket = s3.Bucket(self, "amzn-s3-demo-bucket") # Instantiate Bucket with bucket_name and versioned properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true) # Instantiate Bucket with website_redirect, which has its own sub-properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect( host_name="aws.amazon.com"))
Java

En Java, el argumento props se representa mediante una clase denominada XxxxProps (por ejemplo, BucketProps para los props del constructo Bucket). El argumento props se construye mediante un patrón de construcción.

Cada clase XxxxProps tiene un constructor. También hay un práctico constructor para cada constructo que construye los props y el constructo en un solo paso, como se muestra en el siguiente ejemplo.

Los accesorios tienen el mismo nombre que en TypeScript, con camelCase.

// Instantiate default Bucket Bucket bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with bucketName and versioned properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .bucketName("amzn-s3-demo-bucket").versioned(true) .build(); # Instantiate Bucket with websiteRedirect, which has its own sub-properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .websiteRedirect(new websiteRedirect.Builder() .hostName("aws.amazon.com").build()) .build();
C#

En C#, los props se especifican mediante un inicializador de objetos para una clase llamada XxxxProps (por ejemplo, BucketProps para los props del constructo Bucket).

Los props se nombran de manera similar a TypeScript, excepto que usan PascalCase.

Es conveniente usar la palabra clave var al crear una instancia de un constructo, por lo que no es necesario escribir el nombre de la clase dos veces. Sin embargo, la guía de estilo del código local puede variar.

// Instantiate default Bucket var bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with BucketName and Versioned properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { BucketName = "amzn-s3-demo-bucket", Versioned = true}); // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { WebsiteRedirect = new WebsiteRedirect { HostName = "aws.amazon.com" }});
Go

Para crear un constructo en Go, llama a la función NewXxxxxx donde Xxxxxxx es el nombre del constructo. Las propiedades de los constructos se definen como una estructura.

En Go, todos los parámetros de los constructos son punteros, incluidos valores como números, valores booleanos y cadenas. Utilice funciones prácticas como jsii.String para crear estos punteros.

// Instantiate default Bucket bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil) // Instantiate Bucket with BucketName and Versioned properties bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), Versioned: jsii.Bool(true), }) // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ WebsiteRedirect: &awss3.RedirectTarget{ HostName: jsii.String("aws.amazon.com"), }})

Acceso a los miembros

Es habitual hacer referencia a los atributos o propiedades de los constructos y otras clases de AWS CDK y utilizar estos valores como, por ejemplo, entradas para crear otros constructos. Las diferencias de nomenclatura descritas anteriormente para los métodos también se aplican aquí. Además, en Java, no es posible acceder a los miembros de forma directa. En su lugar, se proporciona un método getter.

TypeScript/JavaScript

Los nombres son camelCase.

bucket.bucketArn
Python

Los nombres son snake_case.

bucket.bucket_arn
Java

Se proporciona un método getter para cada propiedad; estos nombres son camelCase.

bucket.getBucketArn()
C#

Los nombres son PascalCase.

bucket.BucketArn
Go

Los nombres son PascalCase.

bucket.BucketArn

Constantes de enumeración

Las constantes de enumeración se asignan a una clase y tienen nombres en mayúscula con guiones bajos en todos los lenguajes (a veces denominadas SCREAMING_SNAKE_CASE). Como los nombres de clase también utilizan las mismas mayúsculas y minúsculas en todos los lenguajes compatibles, excepto Go, los nombres de enumeración válidos también son los mismos en estos lenguajes.

s3.BucketEncryption.KMS_MANAGED

En Go, las constantes de enumeración son atributos del espacio de nombres del módulo y se escriben de la siguiente manera.

awss3.BucketEncryption_KMS_MANAGED

Interfaces de objetos

El AWS CDK utiliza interfaces de objetos de TypeScript para indicar que una clase implementa un conjunto esperado de métodos y propiedades. Puede reconocer una interfaz de objetos porque su nombre comienza con I. Una clase concreta indica las interfaces que implementa mediante la palabra clave implements.

TypeScript/JavaScript
nota

JavaScript no tiene una característica de interfaz. Puede ignorar la palabra clave implements y los nombres de clase que la siguen.

import { IAspect, IConstruct } from 'aws-cdk-lib'; class MyAspect implements IAspect { public visit(node: IConstruct) { console.log('Visited', node.node.path); } }
Python

Python no tiene una característica de interfaz. Sin embargo, para AWS CDK puede indicar la implementación de la interfaz al decorar la clase con @jsii.implements(interface).

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)
Java
import software.amazon.awscdk.IAspect; import software.amazon.awscdk.IConstruct; public class MyAspect implements IAspect { public void visit(IConstruct node) { System.out.format("Visited %s", node.getNode().getPath()); } }
C#
using Amazon.CDK; public class MyAspect : IAspect { public void Visit(IConstruct node) { System.Console.WriteLine($"Visited ${node.Node.Path}"); } }
Go

Las estructuras de Go no necesitan declarar de forma explícita qué interfaces implementan. El compilador Go determina la implementación en función de los métodos y propiedades disponibles en la estructura. Por ejemplo, en el código siguiente, MyAspect implementa la interfaz IAspect porque proporciona un método Visit que toma un constructo.

type MyAspect struct { } func (a MyAspect) Visit(node constructs.IConstruct) { fmt.Println("Visited", *node.Node().Path()) }