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.
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 init
comando, 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
-
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())
}