Trabaja con la AWS CDK biblioteca - 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.

Trabaja con la AWS CDK biblioteca

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

Importe la AWS CDK biblioteca

A menudo se hace referencia a la AWS CDK biblioteca por su TypeScript nombre del paquete deaws-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 CDK biblioteca:

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
Enpom.xml, añada Gruposoftware.amazon.awscdk; artefacto 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 construct base y el código de apoyo están en la constructs biblioteca. Las construcciones experimentales, en las que aún API se está perfeccionando, se distribuyen como módulos separados.

Uso de la referencia AWS CDK API

Utilice la AWS CDK APIreferencia a medida que desarrolle con el 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 que se ofrece en él AWS CDK, que incluye conceptos y ejemplos.

  • Construcciones: clases de biblioteca que representan uno o más AWS recursos concretos. Estos son los recursos o patrones «seleccionados» (L2) (recursos L3) que proporcionan una interfaz de alto nivel con valores predeterminados adecuados.

  • Clases: clases que no son de construcción y que proporcionan la funcionalidad utilizada por las construcciones del módulo.

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

  • Interfaces: las interfaces, cuyos nombres comienzan todos por «I», definen la funcionalidad mínima absoluta para la construcción correspondiente u otra clase. CDKUtiliza interfaces de construcción para representar AWS los recursos que están definidos fuera de la AWS CDK aplicación y a los que se hace referencia mediante métodos comoBucket.fromBucketArn().

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

  • CloudFormation Recursos: Estas construcciones de L1, cuyos nombres comienzan por «Cfn», representan exactamente los recursos definidos en la especificación. CloudFormation Se generan automáticamente a partir de esa especificación con cada versión. CDK Cada construcción L2 o L3 encapsula uno o más recursos. CloudFormation

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

Comparación de las interfaces con las clases de construcción

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.

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

Por lo tanto, al crear instancias de recursos en tu CDK aplicación, siempre debes usar clases concretas, como. Bucket Cuando especifiques el tipo de argumento que vas a aceptar en una de tus propias construcciones, usa el tipo de interfaz, por ejemplo, IBucket si estás preparado para trabajar con recursos externos (es decir, no necesitarás cambiarlos). Si necesita una construcción CDK definida, especifique el tipo más general que pueda utilizar.

Algunas interfaces son versiones mínimas de propiedades o paquetes de opciones asociados a clases específicas, en lugar de construcciones. Estas interfaces pueden resultar útiles a la hora de subclasificar para aceptar argumentos que pasarás a tu 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 AWS CDK no tienen ninguna función 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 alguna otra construcción (por ejemploIBucket). Se aplican las mismas reglas.

Administrar las dependencias

Las dependencias de tu AWS CDK aplicación o biblioteca se administran mediante herramientas de administración de paquetes. Estas herramientas se utilizan habitualmente con los lenguajes de programación.

Por lo general, es AWS CDK 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 el idioma más popular o más compatible del idioma. Es posible que también puedas usar otras herramientas, especialmente si funcionan con las herramientas compatibles. Sin embargo, el soporte oficial para otras herramientas es limitado.

AWS CDK Es compatible con los siguientes administradores de paquetes:

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

Al crear un nuevo proyecto con el AWS CDK CLI cdk initcomando, las dependencias de las bibliotecas CDK principales y las construcciones estables se especifican automáticamente.

Para obtener más información sobre la administración de las dependencias de los lenguajes de programación compatibles, consulte lo siguiente:

Comparando AWS CDK en TypeScript con otros idiomas

TypeScript fue el primer lenguaje compatible para el desarrollo de AWS CDK aplicaciones. Por lo tanto, está escrita una cantidad sustancial de CDK código de ejemplo TypeScript. Si estás desarrollando en otro idioma, puede ser útil comparar la forma en que se implementa el AWS CDK código en TypeScript comparación con el idioma que elijas. Esto puede ayudarle a utilizar 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 de un espacio de nombres. Cada espacio de nombres incluye componentes fijos y otras clases para su uso con un servicio determinado. AWS

// 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

Por ejemplo TypeScript, Python admite la importación de módulos con espacios de nombres y las importaciones selectivas. Los espacios de nombres en Python se parecen a aws_cdk. xxx, donde xxx representa el nombre de un AWS servicio, 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 TypeScript de Java. Cada sentencia de importación importa un único nombre de clase de un paquete determinado o todas las clases definidas en ese paquete (mediante*). Se puede acceder a las clases utilizando el nombre de la clase en sí mismo si se ha importado, o el nombre de la clase cualificada, incluido su paquete.

Las bibliotecas reciben el mismo software.amazon.awscdk.services.xxx nombre que la biblioteca AWS Construct (la biblioteca principal essoftware.amazon.awscdk). El identificador de grupo de Maven para AWS CDK los paquetes essoftware.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 using directiva. Hay dos estilos. Uno le da acceso a todos los tipos del espacio de nombres especificado utilizando sus nombres simples. Con el otro, puede hacer referencia al propio espacio de nombres mediante un alias.

Los paquetes reciben el mismo nombre que los paquetes Amazon.CDK.AWS.xxx de AWS Construct Library. (El módulo principal esAmazon.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 AWS Construct Library se 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(...)

Creación de una instancia de una construcción

AWS CDK las clases de construcción tienen el mismo nombre en todos los lenguajes compatibles. La mayoría de los lenguajes usan la new palabra clave 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 se usa self por convención). Deberías pasar una referencia a la instancia actual como scope parámetro a cada construcción que crees.

El tercer argumento de una AWS CDK construcción es props un objeto que contiene los atributos necesarios para construir la construcción. Este argumento puede ser opcional, pero cuando es necesario, los lenguajes compatibles lo manejan de forma idiomática. Los nombres de los atributos también se adaptan a los patrones de nomenclatura estándar del idioma.

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 new palabra clave 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 conjunto 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 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 de la Bucket construcción). El argumento props se construye utilizando un patrón de construcción.

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

Los accesorios reciben el mismo nombre que en TypeScript, usando. 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 accesorios se especifican mediante un inicializador de objetos para una clase llamada XxxxProps (por ejemplo, BucketProps para los accesorios de la Bucket construcción).

Los accesorios se nombran de forma similar a, excepto por el uso de. TypeScript PascalCase

Es conveniente utilizar la var palabra clave al crear una instancia de una construcción, 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 una construcción en Go, llama a la función NewXxxxxx donde Xxxxxxx es el nombre de la construcción. Las propiedades de las construcciones se definen como una estructura.

En Go, todos los parámetros de construcción son punteros, incluidos valores como números, valores booleanos y cadenas. Usa 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"), }})

Acceder a los miembros

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

TypeScript/JavaScript

Los nombres soncamelCase.

bucket.bucketArn
Python

Los nombres sonsnake_case.

bucket.bucket_arn
Java

Se proporciona un método de captación para cada propiedad; estos nombres soncamelCase.

bucket.getBucketArn()
C#

Los nombres sonPascalCase.

bucket.BucketArn
Go

Los nombres sonPascalCase.

bucket.BucketArn

Constantes de enumeración

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

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

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

TypeScript/JavaScript
nota

JavaScript no tiene una función de interfaz. Puede ignorar la implements palabra clave 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 función de interfaz. Sin embargo, para eso AWS CDK puedes indicar la implementación de la interfaz decorando tu clase con ella@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 Go no necesitan declarar explícitamente 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 IAspect interfaz porque proporciona un Visit método que toma una construcción.

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