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.
AWS CDK Construcciones
Las construcciones son los componentes básicos de las AWS Cloud Development Kit (AWS CDK) aplicaciones. Una construcción es un componente de la aplicación que representa uno o más AWS CloudFormation recursos y su configuración. Para crear la aplicación, pieza por pieza, se importan y configuran componentes fijos.
Importa y usa construcciones
Los componentes fijos son clases que se importan a CDK las aplicaciones desde la biblioteca de componentes fijos AWS . También puede crear y distribuir sus propias construcciones o usar construcciones creadas por desarrolladores externos.
Las construcciones forman parte del modelo de programación de construcciones (). CPM Están disponibles para su uso con otras herramientas, como CDK para Terraform (CDKtf), CDK para Kubernetes (CDK8s), y Projen.
Numerosos terceros también han publicado construcciones compatibles con. AWS CDK Visite Construct Hub para explorar el ecosistema de socios de AWS CDK construcción.
Construye niveles
Los componentes fijos de la AWS biblioteca de componentes se clasifican en tres niveles. Cada nivel ofrece un nivel de abstracción cada vez mayor. Cuanto mayor sea la abstracción, más fácil será la configuración y se requerirá menos experiencia. Cuanto menor sea la abstracción, mayor será la personalización disponible, lo que requerirá más experiencia.
- Construcciones de nivel 1 (L1)
-
Los constructos L1, también conocidos como CFNrecursos, son los constructos de nivel más bajo y no ofrecen abstracción. Cada construcción de L1 se asigna directamente a un único recurso. AWS CloudFormation Con las construcciones de L1, se importa una construcción que representa un recurso específico. AWS CloudFormation A continuación, defina las propiedades del recurso en la instancia de construcción.
Las construcciones L1 son ideales para utilizarlas cuando se conoce AWS CloudFormation y se necesita un control total sobre la definición de las propiedades de los AWS recursos.
En la biblioteca de AWS construcciones, las construcciones de L1 se nombran empezando porCfn
, seguido de un identificador para el AWS CloudFormation recurso que representan. Por ejemplo, la CfnBucket
construcción es una construcción L1 que representa un recurso. AWS::S3::Bucket
AWS CloudFormation
Las construcciones de L1 se generan a partir de la AWS CloudFormation especificación del recurso. Si existe un recurso en AWS CloudFormation, estará disponible AWS CDK como una construcción L1. Los nuevos recursos o propiedades pueden tardar hasta una semana en estar disponibles en la biblioteca de AWS construcciones. Para obtener más información, consulte la referencia sobre los tipos de AWS
recursos y propiedades en la Guía del AWS CloudFormation usuario.
- Construcciones de nivel 2 (L2)
-
Las construcciones L2, también conocidas como construcciones seleccionadas, son desarrolladas cuidadosamente por el CDK equipo y, por lo general, son el tipo de construcción más utilizado. Las construcciones L2 se asignan directamente a recursos individuales AWS CloudFormation
, de forma similar a las construcciones L1. En comparación con las construcciones L1, las construcciones L2 proporcionan una abstracción de alto nivel mediante un enfoque intuitivo basado en la intención. API Las construcciones de nivel 2 incluyen configuraciones de propiedades predeterminadas y sensatas, políticas de seguridad recomendadas y generan gran parte del código repetitivo y de la lógica necesaria para el usuario.
Las construcciones de nivel 2 también proporcionan métodos auxiliares para la mayoría de los recursos, que facilitan y agilizan la definición de propiedades, permisos, interacciones entre recursos basadas en eventos, etc.
La s3.Bucket
clase es un ejemplo de una construcción de nivel 2 para un recurso de bucket de Amazon Simple Storage Service (Amazon S3).
La biblioteca AWS Construct contiene construcciones de nivel 2 designadas como estables y listas para su uso en producción. En el caso de las construcciones de nivel 2 en fase de desarrollo, se denominan experimentales y se ofrecen en un módulo independiente.
- Construcciones de nivel 3 (L3)
-
Los constructos L3, también conocidos como patrones, son el nivel más alto de abstracción. Cada construcción de L3 puede contener un conjunto de recursos que están configurados para trabajar juntos a fin de realizar una tarea o un servicio específicos dentro de la aplicación. Las construcciones L3 se utilizan para crear AWS arquitecturas completas para casos de uso particulares de la aplicación.
Para proporcionar diseños de sistemas completos, o partes sustanciales de un sistema más grande, las construcciones L3 ofrecen configuraciones de propiedades predeterminadas y fundamentadas. Se basan en un enfoque particular para resolver un problema y proporcionar una solución. Con las construcciones L3, puede crear y configurar varios recursos rápidamente, con la menor cantidad de entrada y código.
La ecsPatterns.ApplicationLoadBalancedFargateService
clase es un ejemplo de una construcción de nivel 3 que representa un AWS Fargate servicio que se ejecuta en un clúster de Amazon Elastic Container Service (AmazonECS) y dirigido por un balanceador de carga de aplicaciones.
Al igual que las construcciones L2, las construcciones L3 que están listas para su uso en producción se incluyen en la biblioteca Construct. AWS Las que están en desarrollo se ofrecen en módulos separados.
Definir construcciones
Composición
La composición es el patrón clave para definir abstracciones de alto nivel a través de constructos. Un constructo de alto nivel puede estar compuesto por cualquier número de constructos de nivel inferior. Desde una perspectiva ascendente, se utilizan componentes fijos para organizar los AWS recursos individuales que se desean implementar. Utiliza las abstracciones que sean convenientes para su propósito, con tantos niveles como necesite.
Con la composición, defines componentes reutilizables y los compartes como cualquier otro código. Por ejemplo, un equipo puede definir una estructura que implemente las mejores prácticas de la empresa para una tabla de Amazon DynamoDB, incluidas las copias de seguridad, la replicación global, el escalado automático y la supervisión. El equipo puede compartir la construcción internamente con otros equipos o públicamente.
Los equipos pueden usar construcciones como cualquier otro paquete de biblioteca. Cuando se actualiza la biblioteca, los desarrolladores tienen acceso a las mejoras y correcciones de errores de la nueva versión, de forma similar a cualquier otra biblioteca de códigos.
Inicialización
Los constructos se implementan en clases que amplían la clase base Construct
. Para definir una construcción, se crea una instancia de la clase. Todos los constructos toman tres parámetros cuando se inicializan:
-
alcance: el padre o el propietario de la construcción. Puede ser una pila u otra construcción. El alcance determina el lugar del componente fijo en el árbol de componentes fijos. Por lo general, debe pasar this
(self
entrar) Python), que representa el objeto actual, para el ámbito.
-
id: un identificador que debe ser único dentro del ámbito. El identificador sirve como espacio de nombres para todo lo que se define en la construcción. Se usa para generar identificadores únicos, como nombres de recursos y lógicos. AWS CloudFormation IDs
Los identificadores solo necesitan ser únicos dentro de un ámbito. Esto le permite crear instancias de las construcciones y reutilizarlas sin preocuparse por las construcciones e identificadores que puedan contener, y permite componer las construcciones en abstracciones de nivel superior. Además, los ámbitos permiten hacer referencia a grupos de construcciones de una sola vez. Algunos ejemplos son el etiquetado o la especificación de dónde se desplegarán las construcciones.
-
props: conjunto de propiedades o argumentos de palabras clave, según el idioma, que definen la configuración inicial de la construcción. Las construcciones de nivel superior proporcionan más valores predeterminados y, si todos los elementos prop son opcionales, puede omitir el parámetro props por completo.
Configuración
La mayoría de las construcciones aceptan props
como tercer argumento (o en Python, argumentos de palabras clave), una colección de nombre/valor que define la configuración de la construcción. El siguiente ejemplo define un depósito con el cifrado AWS Key Management Service (AWS KMS) y el alojamiento de sitios web estáticos habilitados. Como no especifica explícitamente una clave de cifrado, la Bucket
construcción define una nueva kms.Key
y la asocia al depósito.
- TypeScript
-
new s3.Bucket(this, 'MyEncryptedBucket', {
encryption: s3.BucketEncryption.KMS,
websiteIndexDocument: 'index.html'
});
- JavaScript
-
new s3.Bucket(this, 'MyEncryptedBucket', {
encryption: s3.BucketEncryption.KMS,
websiteIndexDocument: 'index.html'
});
- Python
-
s3.Bucket(self, "MyEncryptedBucket", encryption=s3.BucketEncryption.KMS,
website_index_document="index.html")
- Java
-
Bucket.Builder.create(this, "MyEncryptedBucket")
.encryption(BucketEncryption.KMS_MANAGED)
.websiteIndexDocument("index.html").build();
- C#
-
new Bucket(this, "MyEncryptedBucket", new BucketProps
{
Encryption = BucketEncryption.KMS_MANAGED,
WebsiteIndexDocument = "index.html"
});
- Go
-
awss3.NewBucket(stack, jsii.String("MyEncryptedBucket"), &awss3.BucketProps{
Encryption: awss3.BucketEncryption_KMS,
WebsiteIndexDocument: jsii.String("index.html"),
})
Interactuar con los constructos
Los constructos son clases que amplían la clase Construct base. Tras crear una instancia de una construcción, el objeto de construcción expone un conjunto de métodos y propiedades que permiten interactuar con la construcción y transmitirla como referencia a otras partes del sistema.
El AWS CDK marco no impone ninguna restricción a los APIs constructos. Los autores pueden definir API lo que quieran. Sin embargo, las AWS construcciones que se incluyen en la biblioteca AWS Construct, por ejemplos3.Bucket
, siguen pautas y patrones comunes. Esto proporciona una experiencia coherente en todos los AWS recursos.
La mayoría de AWS las construcciones tienen un conjunto de métodos de concesión que puedes usar para conceder AWS Identity and Access Management (IAM) permisos sobre esa construcción a un principal. El siguiente ejemplo concede al IAM grupo data-science
permiso para leer desde el bucket de Amazon S3raw-data
.
- TypeScript
-
const rawData = new s3.Bucket(this, 'raw-data');
const dataScience = new iam.Group(this, 'data-science');
rawData.grantRead(dataScience);
- JavaScript
-
const rawData = new s3.Bucket(this, 'raw-data');
const dataScience = new iam.Group(this, 'data-science');
rawData.grantRead(dataScience);
- Python
-
raw_data = s3.Bucket(self, 'raw-data')
data_science = iam.Group(self, 'data-science')
raw_data.grant_read(data_science)
- Java
-
Bucket rawData = new Bucket(this, "raw-data");
Group dataScience = new Group(this, "data-science");
rawData.grantRead(dataScience);
- C#
-
var rawData = new Bucket(this, "raw-data");
var dataScience = new Group(this, "data-science");
rawData.GrantRead(dataScience);
- Go
-
rawData := awss3.NewBucket(stack, jsii.String("raw-data"), nil)
dataScience := awsiam.NewGroup(stack, jsii.String("data-science"), nil)
rawData.GrantRead(dataScience, nil)
Otro patrón común es que AWS las construcciones establezcan uno de los atributos del recurso a partir de datos suministrados en otros lugares. Los atributos pueden incluir nombres de recursos de Amazon (ARNs), nombres oURLs.
El código siguiente define una AWS Lambda función y la asocia a una cola de Amazon Simple Queue Service (AmazonSQS) a través de las colas de una variable URL de entorno.
- TypeScript
-
const jobsQueue = new sqs.Queue(this, 'jobs');
const createJobLambda = new lambda.Function(this, 'create-job', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('./create-job-lambda-code'),
environment: {
QUEUE_URL: jobsQueue.queueUrl
}
});
- JavaScript
-
const jobsQueue = new sqs.Queue(this, 'jobs');
const createJobLambda = new lambda.Function(this, 'create-job', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('./create-job-lambda-code'),
environment: {
QUEUE_URL: jobsQueue.queueUrl
}
});
- Python
-
jobs_queue = sqs.Queue(self, "jobs")
create_job_lambda = lambda_.Function(self, "create-job",
runtime=lambda_.Runtime.NODEJS_18_X,
handler="index.handler",
code=lambda_.Code.from_asset("./create-job-lambda-code"),
environment=dict(
QUEUE_URL=jobs_queue.queue_url
)
)
- Java
-
final Queue jobsQueue = new Queue(this, "jobs");
Function createJobLambda = Function.Builder.create(this, "create-job")
.handler("index.handler")
.code(Code.fromAsset("./create-job-lambda-code"))
.environment(java.util.Map.of( // Map.of is Java 9 or later
"QUEUE_URL", jobsQueue.getQueueUrl())
.build();
- C#
-
var jobsQueue = new Queue(this, "jobs");
var createJobLambda = new Function(this, "create-job", new FunctionProps
{
Runtime = Runtime.NODEJS_18_X,
Handler = "index.handler",
Code = Code.FromAsset(@".\create-job-lambda-code"),
Environment = new Dictionary<string, string>
{
["QUEUE_URL"] = jobsQueue.QueueUrl
}
});
- Go
-
createJobLambda := awslambda.NewFunction(stack, jsii.String("create-job"), &awslambda.FunctionProps{
Runtime: awslambda.Runtime_NODEJS_18_X(),
Handler: jsii.String("index.handler"),
Code: awslambda.Code_FromAsset(jsii.String(".\\create-job-lambda-code"), nil),
Environment: &map[string]*string{
"QUEUE_URL": jsii.String(*jobsQueue.QueueUrl()),
},
})
Para obtener información sobre los API patrones más comunes de la biblioteca AWS Construct, consulte. Los recursos y la AWS CDK
La construcción de la aplicación y la pila
Stack
Las clases App
y de la biblioteca AWS Construct son construcciones únicas. En comparación con otras construcciones, no configuran AWS los recursos por sí mismas. En cambio, se utilizan para proporcionar contexto a las otras construcciones. Todos los constructos que representan AWS
recursos deben definirse, directa o indirectamente, dentro del ámbito de un Stack
constructo. Stack
los constructos se definen dentro del ámbito de un App
constructo.
Para obtener más información sobre CDK las aplicaciones, consulteAWS CDK aplicaciones. Para obtener más información sobre las CDK pilas, consulteAWS CDK pilas.
En el siguiente ejemplo, se define una aplicación con una sola pila. Dentro de la pila, se utiliza una construcción L2 para configurar un recurso de bucket de Amazon S3.
- TypeScript
-
import { App, Stack, StackProps } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
class HelloCdkStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}
const app = new App();
new HelloCdkStack(app, "HelloCdkStack");
- JavaScript
-
const { App , Stack } = require('aws-cdk-lib');
const s3 = require('aws-cdk-lib/aws-s3');
class HelloCdkStack extends Stack {
constructor(scope, id, props) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}
const app = new App();
new HelloCdkStack(app, "HelloCdkStack");
- Python
-
from aws_cdk import App, Stack
import aws_cdk.aws_s3 as s3
from constructs import Construct
class HelloCdkStack(Stack):
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
s3.Bucket(self, "MyFirstBucket", versioned=True)
app = App()
HelloCdkStack(app, "HelloCdkStack")
- Java
-
Pila definida en el HelloCdkStack.java
archivo:
import software.constructs.Construct;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;
import software.amazon.awscdk.services.s3.*;
public class HelloCdkStack extends Stack {
public HelloCdkStack(final Construct scope, final String id) {
this(scope, id, null);
}
public HelloCdkStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
Bucket.Builder.create(this, "MyFirstBucket")
.versioned(true).build();
}
}
Aplicación definida en el HelloCdkApp.java
archivo:
import software.amazon.awscdk.App;
import software.amazon.awscdk.StackProps;
public class HelloCdkApp {
public static void main(final String[] args) {
App app = new App();
new HelloCdkStack(app, "HelloCdkStack", StackProps.builder()
.build());
app.synth();
}
}
- C#
-
using Amazon.CDK;
using Amazon.CDK.AWS.S3;
namespace HelloCdkApp
{
internal static class Program
{
public static void Main(string[] args)
{
var app = new App();
new HelloCdkStack(app, "HelloCdkStack");
app.Synth();
}
}
public class HelloCdkStack : Stack
{
public HelloCdkStack(Construct scope, string id, IStackProps props=null) : base(scope, id, props)
{
new Bucket(this, "MyFirstBucket", new BucketProps { Versioned = true });
}
}
}
- Go
-
func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack {
var sprops awscdk.StackProps
if props != nil {
sprops = props.StackProps
}
stack := awscdk.NewStack(scope, &id, &sprops)
awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{
Versioned: jsii.Bool(true),
})
return stack
}
Trabajando con construcciones
Trabajando con construcciones L1
Las construcciones de L1 asignan directamente a los recursos individuales. AWS CloudFormation Debe proporcionar la configuración requerida del recurso.
En este ejemplo, creamos un bucket
objeto mediante la construcción CfnBucket
L1:
- TypeScript
-
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket"
});
- JavaScript
-
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket"
});
- Python
-
bucket = s3.CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket")
- Java
-
CfnBucket bucket = new CfnBucket.Builder().bucketName("amzn-s3-demo-bucket").build();
- C#
-
var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps
{
BucketName= "amzn-s3-demo-bucket"
});
- Go
-
awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
})
Las propiedades de construcción que no sean simples booleanos, cadenas, números o contenedores se gestionan de forma diferente en los lenguajes compatibles.
- TypeScript
-
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket",
corsConfiguration: {
corsRules: [{
allowedOrigins: ["*"],
allowedMethods: ["GET"]
}]
}
});
- JavaScript
-
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket",
corsConfiguration: {
corsRules: [{
allowedOrigins: ["*"],
allowedMethods: ["GET"]
}]
}
});
- Python
-
En Python, estas propiedades se representan mediante tipos definidos como clases internas de la construcción L1. Por ejemplo, la propiedad opcional cors_configuration
de a CfnBucket
requiere un contenedor de tipo. CfnBucket.CorsConfigurationProperty
Aquí estamos definiendo cors_configuration
en una CfnBucket
instancia.
bucket = CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket",
cors_configuration=CfnBucket.CorsConfigurationProperty(
cors_rules=[CfnBucket.CorsRuleProperty(
allowed_origins=["*"],
allowed_methods=["GET"]
)]
)
)
- Java
-
En Java, estas propiedades se representan mediante tipos definidos como clases internas de la construcción L1. Por ejemplo, la propiedad opcional corsConfiguration
de a CfnBucket
requiere un contenedor de tipo. CfnBucket.CorsConfigurationProperty
Aquí estamos definiendo corsConfiguration
en una CfnBucket
instancia.
CfnBucket bucket = CfnBucket.Builder.create(this, "amzn-s3-demo-bucket")
.bucketName("amzn-s3-demo-bucket")
.corsConfiguration(new CfnBucket.CorsConfigurationProperty.Builder()
.corsRules(Arrays.asList(new CfnBucket.CorsRuleProperty.Builder()
.allowedOrigins(Arrays.asList("*"))
.allowedMethods(Arrays.asList("GET"))
.build()))
.build())
.build();
- C#
-
En C#, estas propiedades se representan mediante tipos definidos como clases internas de la construcción L1. Por ejemplo, la propiedad opcional CorsConfiguration
de a CfnBucket
requiere un contenedor de tipo. CfnBucket.CorsConfigurationProperty
Aquí estamos definiendo CorsConfiguration
en una CfnBucket
instancia.
var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps
{
BucketName = "amzn-s3-demo-bucket",
CorsConfiguration = new CfnBucket.CorsConfigurationProperty
{
CorsRules = new object[] {
new CfnBucket.CorsRuleProperty
{
AllowedOrigins = new string[] { "*" },
AllowedMethods = new string[] { "GET" },
}
}
}
});
- Go
-
En Go, estos tipos se nombran con el nombre de la construcción L1, un guión bajo y el nombre de la propiedad. Por ejemplo, la propiedad opcional CorsConfiguration
de a CfnBucket
requiere un contenedor de tipo. CfnBucket_CorsConfigurationProperty
Aquí estamos definiendo CorsConfiguration
en una CfnBucket
instancia.
awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
CorsConfiguration: &awss3.CfnBucket_CorsConfigurationProperty{
CorsRules: []awss3.CorsRule{
awss3.CorsRule{
AllowedOrigins: jsii.Strings("*"),
AllowedMethods: &[]awss3.HttpMethods{"GET"},
},
},
},
})
No puedes usar tipos de propiedades L2 con construcciones L1, o viceversa. Cuando trabaje con construcciones de L1, utilice siempre los tipos definidos para la construcción de L1 que utilice. No utilice tipos de otras construcciones de L1 (algunas pueden tener el mismo nombre, pero no son del mismo tipo).
Actualmente, algunas de nuestras API referencias específicas de idiomas tienen errores en las rutas a los tipos de propiedades de L1 o no documentan estas clases en absoluto. Esperamos solucionar este problema pronto. Mientras tanto, recuerde que estos tipos son siempre clases internas de la construcción L1 con la que se utilizan.
Trabajando con construcciones L2
En el siguiente ejemplo, definimos un bucket de Amazon S3 mediante la creación de un objeto a partir de la construcción Bucket
L2:
- TypeScript
-
import * as s3 from 'aws-cdk-lib/aws-s3';
// "this" is HelloCdkStack
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
- JavaScript
-
const s3 = require('aws-cdk-lib/aws-s3');
// "this" is HelloCdkStack
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
- Python
-
import aws_cdk.aws_s3 as s3
# "self" is HelloCdkStack
s3.Bucket(self, "MyFirstBucket", versioned=True)
- Java
-
import software.amazon.awscdk.services.s3.*;
public class HelloCdkStack extends Stack {
public HelloCdkStack(final Construct scope, final String id) {
this(scope, id, null);
}
public HelloCdkStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
Bucket.Builder.create(this, "MyFirstBucket")
.versioned(true).build();
}
}
- C#
-
using Amazon.CDK.AWS.S3;
// "this" is HelloCdkStack
new Bucket(this, "MyFirstBucket", new BucketProps
{
Versioned = true
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2/awss3"
"github.com/aws/jsii-runtime-go"
)
// stack is HelloCdkStack
awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{
Versioned: jsii.Bool(true),
})>
MyFirstBucket
no es el nombre del bucket que se AWS CloudFormation crea. Es un identificador lógico que se asigna a la nueva construcción en el contexto de tu CDK aplicación. El physicalNamevalor se usará para nombrar el AWS CloudFormation recurso.
Trabajar con construcciones de terceros
Construct Hub es un recurso que le ayuda a descubrir otras construcciones de AWS terceros y de la comunidad de código abiertoCDK.
Escribiendo tus propias construcciones
Además de usar las construcciones existentes, también puedes escribir las tuyas propias y permitir que cualquiera las use en sus aplicaciones. Todas las construcciones son iguales en. AWS CDK Las construcciones de la biblioteca de AWS construcciones se tratan de la misma manera que una construcción de una biblioteca de terceros publicada mediante NPM, Maven, o PyPI. Los constructos publicados en el repositorio de paquetes interno de su empresa también se tratan de la misma manera.
Para declarar una nueva construcción, cree una clase que amplíe la clase base de Construct en el constructs
paquete y, a continuación, siga el patrón de los argumentos del inicializador.
El siguiente ejemplo muestra cómo declarar una construcción que representa un bucket de Amazon S3. El bucket S3 envía una notificación de Amazon Simple Notification Service (AmazonSNS) cada vez que alguien carga un archivo en él.
- TypeScript
-
export interface NotifyingBucketProps {
prefix?: string;
}
export class NotifyingBucket extends Construct {
constructor(scope: Construct, id: string, props: NotifyingBucketProps = {}) {
super(scope, id);
const bucket = new s3.Bucket(this, 'bucket');
const topic = new sns.Topic(this, 'topic');
bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic),
{ prefix: props.prefix });
}
}
- JavaScript
-
class NotifyingBucket extends Construct {
constructor(scope, id, props = {}) {
super(scope, id);
const bucket = new s3.Bucket(this, 'bucket');
const topic = new sns.Topic(this, 'topic');
bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic),
{ prefix: props.prefix });
}
}
module.exports = { NotifyingBucket }
- Python
-
class NotifyingBucket(Construct):
def __init__(self, scope: Construct, id: str, *, prefix=None):
super().__init__(scope, id)
bucket = s3.Bucket(self, "bucket")
topic = sns.Topic(self, "topic")
bucket.add_object_created_notification(s3notify.SnsDestination(topic),
s3.NotificationKeyFilter(prefix=prefix))
- Java
-
public class NotifyingBucket extends Construct {
public NotifyingBucket(final Construct scope, final String id) {
this(scope, id, null, null);
}
public NotifyingBucket(final Construct scope, final String id, final BucketProps props) {
this(scope, id, props, null);
}
public NotifyingBucket(final Construct scope, final String id, final String prefix) {
this(scope, id, null, prefix);
}
public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) {
super(scope, id);
Bucket bucket = new Bucket(this, "bucket");
Topic topic = new Topic(this, "topic");
if (prefix != null)
bucket.addObjectCreatedNotification(new SnsDestination(topic),
NotificationKeyFilter.builder().prefix(prefix).build());
}
}
- C#
-
public class NotifyingBucketProps : BucketProps
{
public string Prefix { get; set; }
}
public class NotifyingBucket : Construct
{
public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id)
{
var bucket = new Bucket(this, "bucket");
var topic = new Topic(this, "topic");
bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter
{
Prefix = props?.Prefix
});
}
}
- Go
-
type NotifyingBucketProps struct {
awss3.BucketProps
Prefix *string
}
func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) awss3.Bucket {
var bucket awss3.Bucket
if props == nil {
bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil)
} else {
bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps)
}
topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil)
if props == nil {
bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic))
} else {
bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{
Prefix: props.Prefix,
})
}
return bucket
}
Nuestra NotifyingBucket
construcción no hereda de, Bucket
sino más bien de. Construct
Usamos la composición, no la herencia, para agrupar un bucket de Amazon S3 y un SNS tema de Amazon. En general, se prefiere la composición a la herencia a la hora de desarrollar AWS CDK construcciones.
El NotifyingBucket
constructor tiene una firma de construcción típica: scope
id
, yprops
. El último argumento,props
, es opcional (obtiene el valor predeterminado{}
) porque todos los accesorios son opcionales. (La Construct
clase base no acepta ningún props
argumento). Podrías definir una instancia de esta construcción en tu aplicación sinprops
, por ejemplo:
- TypeScript
-
new NotifyingBucket(this, 'MyNotifyingBucket');
- JavaScript
-
new NotifyingBucket(this, 'MyNotifyingBucket');
- Python
-
NotifyingBucket(self, "MyNotifyingBucket")
- Java
-
new NotifyingBucket(this, "MyNotifyingBucket");
- C#
-
new NotifyingBucket(this, "MyNotifyingBucket");
- Go
-
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), nil)
O puedes usar props
(en Java, un parámetro adicional) para especificar el prefijo de ruta por el que deseas filtrar, por ejemplo:
- TypeScript
-
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
- JavaScript
-
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
- Python
-
NotifyingBucket(self, "MyNotifyingBucket", prefix="images/")
- Java
-
new NotifyingBucket(this, "MyNotifyingBucket", "/images");
- C#
-
new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps
{
Prefix = "/images"
});
- Go
-
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{
Prefix: jsii.String("images/"),
})
Por lo general, también querrá exponer algunas propiedades o métodos en sus construcciones. No es muy útil tener un tema oculto detrás de la construcción, ya que los usuarios de la construcción no pueden suscribirse a ella. Añadir una topic
propiedad permite a los consumidores acceder al tema interno, como se muestra en el siguiente ejemplo:
- TypeScript
-
export class NotifyingBucket extends Construct {
public readonly topic: sns.Topic;
constructor(scope: Construct, id: string, props: NotifyingBucketProps) {
super(scope, id);
const bucket = new s3.Bucket(this, 'bucket');
this.topic = new sns.Topic(this, 'topic');
bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix });
}
}
- JavaScript
-
class NotifyingBucket extends Construct {
constructor(scope, id, props) {
super(scope, id);
const bucket = new s3.Bucket(this, 'bucket');
this.topic = new sns.Topic(this, 'topic');
bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix });
}
}
module.exports = { NotifyingBucket };
- Python
-
class NotifyingBucket(Construct):
def __init__(self, scope: Construct, id: str, *, prefix=None, **kwargs):
super().__init__(scope, id)
bucket = s3.Bucket(self, "bucket")
self.topic = sns.Topic(self, "topic")
bucket.add_object_created_notification(s3notify.SnsDestination(self.topic),
s3.NotificationKeyFilter(prefix=prefix))
- Java
-
public class NotifyingBucket extends Construct {
public Topic topic = null;
public NotifyingBucket(final Construct scope, final String id) {
this(scope, id, null, null);
}
public NotifyingBucket(final Construct scope, final String id, final BucketProps props) {
this(scope, id, props, null);
}
public NotifyingBucket(final Construct scope, final String id, final String prefix) {
this(scope, id, null, prefix);
}
public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) {
super(scope, id);
Bucket bucket = new Bucket(this, "bucket");
topic = new Topic(this, "topic");
if (prefix != null)
bucket.addObjectCreatedNotification(new SnsDestination(topic),
NotificationKeyFilter.builder().prefix(prefix).build());
}
}
- C#
-
public class NotifyingBucket : Construct
{
public readonly Topic topic;
public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id)
{
var bucket = new Bucket(this, "bucket");
topic = new Topic(this, "topic");
bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter
{
Prefix = props?.Prefix
});
}
}
- Go
-
Para hacer esto en Go, necesitaremos un poco más de fontanería. Nuestra NewNotifyingBucket
función original devolvió unawss3.Bucket
. Tendremos que ampliarla Bucket
para incluir un topic
miembro mediante la creación de una NotifyingBucket
estructura. Nuestra función devolverá entonces este tipo.
type NotifyingBucket struct {
awss3.Bucket
topic awssns.Topic
}
func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) NotifyingBucket {
var bucket awss3.Bucket
if props == nil {
bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil)
} else {
bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps)
}
topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil)
if props == nil {
bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic))
} else {
bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{
Prefix: props.Prefix,
})
}
var nbucket NotifyingBucket
nbucket.Bucket = bucket
nbucket.topic = topic
return nbucket
}
Ahora, los consumidores pueden suscribirse al tema, por ejemplo:
- TypeScript
-
const queue = new sqs.Queue(this, 'NewImagesQueue');
const images = new NotifyingBucket(this, '/images');
images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
- JavaScript
-
const queue = new sqs.Queue(this, 'NewImagesQueue');
const images = new NotifyingBucket(this, '/images');
images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
- Python
-
queue = sqs.Queue(self, "NewImagesQueue")
images = NotifyingBucket(self, prefix="Images")
images.topic.add_subscription(sns_sub.SqsSubscription(queue))
- Java
-
NotifyingBucket images = new NotifyingBucket(this, "MyNotifyingBucket", "/images");
images.topic.addSubscription(new SqsSubscription(queue));
- C#
-
var queue = new Queue(this, "NewImagesQueue");
var images = new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps
{
Prefix = "/images"
});
images.topic.AddSubscription(new SqsSubscription(queue));
- Go
-
queue := awssqs.NewQueue(stack, jsii.String("NewImagesQueue"), nil)
images := NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{
Prefix: jsii.String("/images"),
})
images.topic.AddSubscription(awssnssubscriptions.NewSqsSubscription(queue, nil))
Más información
En el siguiente vídeo se ofrece una visión general CDK completa de las estructuras y se explica cómo utilizarlas en CDK las aplicaciones.