Este é o Guia do Desenvolvedor AWS CDK v2. O CDK v1 antigo entrou em manutenção em 1º de junho de 2022 e encerrou o suporte em 1º de junho de 2023.
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
As construções são os blocos de construção básicos dos AWS Cloud Development Kit (AWS CDK) aplicativos. Uma construção é um componente em seu aplicativo que representa um ou mais AWS CloudFormation recursos e sua configuração. Você compila sua aplicação, parte por parte, importando e configurando constructos.
Importar e usar constructos
Os constructos são classes que você importa para suas aplicações do CDK da Biblioteca de Constructos da AWS. Você também pode criar e distribuir seus próprios constructos ou usar constructos criados por desenvolvedores terceirizados.
Os constructos fazem parte do Construct Programming Model (CPM – Modelo de programação de constructo). Eles estão disponíveis para uso com outras ferramentas, como o CDK para Terraform (CDKtf), CDK para Kubernetes (CDK8s), e Projen.
Vários terceiros também publicaram constructos compatíveis com o AWS CDK. Visite o Construct Hub
Níveis de constructo
As construções da AWS Construct Library são categorizadas em três níveis. Cada nível oferece um nível crescente de abstração. Quanto maior a abstração, mais fácil de configurar, exigindo menos experiência. Quanto menor a abstração, mais personalização está disponível, exigindo mais experiência.
- Constructos de nível 1 (L1)
-
Os constructos L1, também conhecidos como recursos do CFN, são os constructos de nível mais baixo e não oferecem abstração. Cada construção L1 é mapeada diretamente para um único AWS CloudFormation recurso. Com construções L1, você importa uma construção que representa um recurso específico AWS CloudFormation . Em seguida, você define as propriedades do recurso em sua instância de constructo.
As construções L1 são ótimas para usar quando você está familiarizado AWS CloudFormation e precisa de controle total sobre a definição das propriedades de seus AWS recursos.
Na AWS Construct Library, as construções L1 são nomeadas começando com
Cfn
, seguidas por um identificador para o AWS CloudFormation recurso que elas representam. Por exemplo, aCfnBucket
construção é uma construção L1 que representa umAWS::S3::Bucket
AWS CloudFormation recurso.Os constructos L1 são gerados a partir da especificação do recurso do AWS CloudFormation. Se um recurso existir em AWS CloudFormation, ele estará disponível no AWS CDK como uma construção L1. Novos recursos ou propriedades podem levar até uma semana para serem disponibilizados na AWS Construct Library. Para obter mais informações, consulte Referência de tipos de propriedade e recursos da AWS no Guia do usuário do AWS CloudFormation .
- Constructos de nível 2 (L2)
-
Os constructos L2, também conhecidas como constructos curados, são cuidadosamente desenvolvidos pela equipe do CDK e geralmente são o tipo de constructo mais amplamente usado. Os constructos L2 são mapeados diretamente para recursos do AWS CloudFormation individuais, semelhantes aos constructos L1. Em comparação com os constructos L1, os constructos L2 fornecem uma abstração de alto nível por meio de uma API intuitiva baseada em intenção. Os constructos L2 incluem configurações de propriedades padrão sensatas, políticas de segurança de práticas recomendadas e geram muito código clichê e lógica de colagem para você.
Os constructos L2 também fornecem métodos auxiliares para a maioria dos recursos que simplificam e agilizam a definição de propriedades, permissões, interações baseadas em eventos entre recursos e muito mais.
A classe
s3.Bucket
é um exemplo de um constructo L2 para um recurso de bucket do Amazon Simple Storage Service (Amazon S3).A AWS Construct Library contém construções L2 que são designadas como estáveis e prontas para uso em produção. Para constructos L2 em desenvolvimento, eles são designados como experimentais e oferecidos em um módulo separado.
- Constructos de nível 3 (L3)
-
Os constructos L3, também conhecidos como padrões, são o nível mais alto de abstração. Cada constructo L3 pode conter uma coleção de recursos que são configurados para trabalhar juntos para realizar uma tarefa ou serviço específico em sua aplicação. As construções L3 são usadas para criar AWS arquiteturas inteiras para casos de uso específicos em seu aplicativo.
Para fornecer projetos de sistema completos ou partes substanciais de um sistema maior, os constructos L3 oferecem configurações de propriedades padrão opinativas. Eles são construídos em torno de uma abordagem específica para resolver um problema e fornecer uma solução. Com constructos L3, você pode criar e configurar vários recursos rapidamente, com a menor quantidade de entrada e código.
A
ecsPatterns.ApplicationLoadBalancedFargateService
classe é um exemplo de uma construção L3 que representa um AWS Fargate serviço executado em um cluster do Amazon Elastic Container Service (Amazon ECS) e liderado por um balanceador de carga de aplicativos.Semelhantes às construções L2, as construções L3 que estão prontas para uso em produção estão incluídas na Construct Library. AWS Os que estão em desenvolvimento são oferecidos em módulos separados.
Definição de constructos
Composição
A composição é o padrão chave para definir abstrações de alto nível por meio de constructos. Um constructo de alto nível pode ser composto a partir de qualquer número de constructos de nível inferior. De uma perspectiva de baixo para cima, você usa construções para organizar os AWS recursos individuais que deseja implantar. Você usa quaisquer abstrações que sejam convenientes para seu propósito, com quantos níveis precisar.
Com a composição, você define componentes reutilizáveis e os compartilha como qualquer outro código. Por exemplo, uma equipe pode definir um constructo que implemente as práticas recomendadas da empresa em uma tabela do Amazon DynamoDB, incluindo backup, replicação global, escalabilidade automática e monitoramento. A equipe pode compartilhar o constructo internamente com outras equipes ou publicamente.
As equipes podem usar constructos como qualquer outro pacote de biblioteca. Quando a biblioteca é atualizada, os desenvolvedores têm acesso às melhorias e correções de erros da nova versão, de forma semelhante a qualquer outra biblioteca de código.
Inicialização
As estruturas são implementadas em classes que estendem a classe base no Construct
. Você define um constructo instanciando a classe. Todas as estruturas usam três parâmetros ao serem inicializadas:
-
escopo: o pai ou proprietário do constructo. Pode ser uma pilha ou outro constructo. O escopo determina o lugar do constructo na árvore de constructos. Você geralmente deve passar
this
(self
em Python), que representa o objeto atual, para o escopo. -
id: um identificador que deve ser exclusivo dentro desse escopo. O identificador serve como um namespace para tudo o que está definido no constructo. Ele é usado para gerar identificadores exclusivos, como nomes de recursos e AWS CloudFormation lógicos IDs.
Os identificadores só precisam ser exclusivos dentro de um escopo. Ele permite que você instancie e reutilize constructos sem se preocupar com os constructos e identificadores que eles possam conter, além de permitir a composição de constructos em abstrações de alto nível. Além disso, os escopos possibilitam a referência a grupos de constructos de uma só vez. Os exemplos incluem a marcação ou a especificação de onde os constructos serão implantados.
-
props: um conjunto de propriedades ou argumentos de palavras-chave, dependendo da linguagem, que definem a configuração inicial do constructo. Constructos de nível superior fornecem mais padrões e, se todos os elementos prop forem opcionais, você poderá omitir completamente o parâmetro props.
Configuração
A maioria dos constructos aceita props
como terceiro argumento (ou, em Python, argumentos de palavra-chave), uma coleção de nome/valor que define a configuração do constructo. O exemplo a seguir define um bucket com criptografia AWS Key Management Service (AWS KMS) e hospedagem estática de sites ativadas. Como não especifica explicitamente uma chave de criptografia, o constructo do Bucket
define uma nova kms.Key
e a associa ao bucket.
new s3.Bucket(this, 'MyEncryptedBucket', {
encryption: s3.BucketEncryption.KMS,
websiteIndexDocument: 'index.html'
});
Interagir com constructos
Os constructos são implementados em classes que estendem a classe de constructo de base. Depois de instanciar um constructo, o objeto do constructo expõe um conjunto de métodos e propriedades que permitem que você interaja com o constructo e o transmita como referência para outras partes do sistema.
A AWS CDK estrutura não impõe nenhuma restrição às APIs construções. Os autores podem definir qualquer API que quiserem. No entanto, as AWS construções incluídas na AWS Construct Library, por exemplos3.Bucket
, seguem diretrizes e padrões comuns. Isso proporciona uma experiência consistente em todos os AWS recursos.
A maioria das AWS construções tem um conjunto de métodos de concessão que você pode usar para conceder permissões AWS Identity and Access Management (IAM) sobre essa construção a um diretor. O exemplo a seguir concede a permissão data-science
ao grupo do IAM para ler a partir do bucket raw-data
do Amazon S3.
const rawData = new s3.Bucket(this, 'raw-data');
const dataScience = new iam.Group(this, 'data-science');
rawData.grantRead(dataScience);
Outro padrão comum é que AWS as construções definam um dos atributos do recurso a partir de dados fornecidos em outro lugar. Os atributos podem incluir nomes de recursos da Amazon (ARNs), nomes ou URLs.
O código a seguir define uma AWS Lambda função e a associa a uma fila do Amazon Simple Queue Service (Amazon SQS) por meio da URL da fila em uma variável de ambiente.
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
}
});
Para obter informações sobre os padrões de API mais comuns na AWS Construct Library, consulteRecursos e o AWS CDK.
O constructo da aplicação e da pilha
As Stack
classes App
e da AWS Construct Library são construções exclusivas. Em comparação com outras construções, elas não configuram AWS recursos sozinhas. Em vez disso, eles usados para fornecer contexto para seus outros constructos. Todos os constructos que representam recursos da AWS
devem ser definidos, direta ou indiretamente, dentro do escopo de um constructo da Stack
. Os constructos da Stack
são definidos dentro do escopo do constructo de um App
.
Para saber mais sobre as aplicações do CDK, consulte AWS CDK aplicativos. Para saber mais sobre as pilhas do CDK, consulte Introdução às AWS CDK pilhas.
O exemplo a seguir define uma aplicação com uma única pilha. Dentro da pilha, um constructo L2 é usado para configurar um recurso de bucket do Amazon S3.
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");
Trabalhar com constructos
Trabalhar com constructos L1
L1 constrói mapas diretamente para recursos individuais AWS CloudFormation . Você mesmo deve fornecer a configuração necessária para o recurso.
Neste exemplo, criamos um objeto de bucket
usando o constructo L1 CfnBucket
:
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket"
});
Propriedades de constructo que não são simples booleanos, strings, números ou contêineres são tratados de forma diferente nas linguagens compatíveis.
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket",
corsConfiguration: {
corsRules: [{
allowedOrigins: ["*"],
allowedMethods: ["GET"]
}]
}
});
Importante
Você não pode usar tipos de propriedade L2 com constructos L1 ou vice-versa. Ao trabalhar com constructos L1, sempre use os tipos definidos para o constructo L1 que você está usando. Não use tipos de outros constructos L1 (alguns podem ter o mesmo nome, mas não são do mesmo tipo).
Algumas de nossas referências de API específicas da linguagem atualmente têm erros nos caminhos para os tipos de propriedades L1 ou não documentam essas classes. Esperamos corrigir isso em breve. Enquanto isso, lembre-se de que esses tipos são sempre classes internas do constructo L1 com o qual são usados.
Trabalhar com constructos L2
No exemplo a seguir, definimos um bucket do Amazon S3 criando um objeto a partir do constructo L2 do Bucket
:
import * as s3 from 'aws-cdk-lib/aws-s3';
// "this" is HelloCdkStack
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
MyFirstBucket
não é o nome do bucket que AWS CloudFormation cria. É um identificador lógico fornecido ao novo constructo dentro do contexto da sua aplicação do CDK. O valor PhysicalName será usado para nomear o AWS CloudFormation recurso.
Trabalhar com constructos de terceiros
O Construct Hub
Escrever seus próprios constructos
Além de usar constructos existentes, você também pode escrever seus próprios constructos e permitir que qualquer pessoa os use em suas aplicações. Todos os constructos são iguais no AWS CDK. As construções da AWS Construct Library são tratadas da mesma forma que uma construção de uma biblioteca de terceiros publicada via NPM, Maven ou PyPI. As construções publicadas no repositório interno de pacotes da sua empresa também são tratadas da mesma forma.
Para declarar um novo constructo, crie uma classe que estenda a classe de base do Constructo no pacote constructs
e siga o padrão dos argumentos do inicializador.
O exemplo a seguir mostra como declarar um constructo que representa um bucket do Amazon S3. O bucket do S3 envia uma notificação do Amazon Simple Notification Service (Amazon SNS) toda vez que alguém carrega um arquivo nele.
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 });
}
}
nota
Nosso constructo NotifyingBucket
não herda não do Bucket
, mas sim do Construct
. Estamos usando composição, não herança, para agrupar um bucket do Amazon S3 e um tópico do Amazon SNS. Em geral, a composição é preferida à herança ao desenvolver AWS CDK construções.
O construtor NotifyingBucket
tem uma assinatura de constructo típica: scope
, id
e props
. O último argumento, props
, é opcional (obtém o valor padrão {}
) porque todos os props são opcionais. (A classe de base do Construct
não aceita um argumento props
.) Você pode definir uma instância desse constructo em sua aplicação sem props
, por exemplo:
new NotifyingBucket(this, 'MyNotifyingBucket');
Ou você pode usar props
(em Java, um parâmetro adicional) para especificar o prefixo do caminho a ser filtrado, por exemplo:
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
Normalmente, você também gostaria de expor algumas propriedades ou métodos em seus constructos. Não é muito útil ter um tópico escondido atrás de seu constructo, porque os usuários de seu constructo não conseguem assiná-lo. Adicionar uma propriedade topic
permite que os consumidores acessem o tópico interno, conforme mostrado no exemplo a seguir:
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 });
}
}
Agora, os consumidores podem assinar o tópico, por exemplo:
const queue = new sqs.Queue(this, 'NewImagesQueue');
const images = new NotifyingBucket(this, '/images');
images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
Saiba mais
O vídeo a seguir fornece uma visão geral abrangente dos constructos do CDK e explica como você pode usá-los em suas aplicações do CDK.