Este é o Guia do Desenvolvedor AWS CDK v2. A versão CDK 1 mais antiga 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á.
Aspectos e o AWS CDK
Aspectos são uma forma de aplicar uma operação a todas as construções em um determinado escopo. O aspecto pode modificar as construções, por exemplo, adicionando tags. Ou pode verificar algo sobre o estado das construções, como garantir que todos os buckets estejam criptografados.
Para aplicar um aspecto a uma construção e a todas as construções no mesmo escopo, chame Aspects
.of(SCOPE
).add()
com um novo aspecto, conforme mostrado no exemplo a seguir.
- TypeScript
-
Aspects.of(myConstruct).add(new SomeAspect(...));
- JavaScript
-
Aspects.of(myConstruct).add(new SomeAspect(...));
- Python
-
Aspects.of(my_construct).add(SomeAspect(...))
- Java
-
Aspects.of(myConstruct).add(new SomeAspect(...));
- C#
-
Aspects.Of(myConstruct).add(new SomeAspect(...));
- Go
-
awscdk.Aspects_Of(stack).Add(awscdk.NewTag(...))
AWS CDK Ele usa aspectos para marcar recursos, mas a estrutura também pode ser usada para outros fins. Por exemplo, você pode usá-lo para validar ou alterar os AWS CloudFormation recursos definidos para você por construções de nível superior.
Aspectos em detalhes
Os aspectos empregam o padrão do visitante. Um aspecto é uma classe que implementa a interface a seguir.
- TypeScript
-
interface IAspect {
visit(node: IConstruct): void;}
- JavaScript
-
JavaScript não tem interfaces como recurso de linguagem. Portanto, um aspecto é simplesmente uma instância de uma classe com um visit
método que aceita o nó a ser operado.
- Python
-
O Python não tem interfaces como recurso de linguagem. Portanto, um aspecto é simplesmente uma instância de uma classe com um visit
método que aceita o nó a ser operado.
- Java
-
public interface IAspect {
public void visit(Construct node);
}
- C#
-
public interface IAspect
{
void Visit(IConstruct node);
}
- Go
-
type IAspect interface {
Visit(node constructs.IConstruct)
}
Quando você chamaAspects.of(SCOPE
).add(...)
, a construção adiciona o aspecto a uma lista interna de aspectos. Você pode obter a lista comAspects.of(SCOPE
)
.
Durante a fase de preparação, ele AWS CDK chama o visit
método do objeto para a construção e cada um de seus filhos em ordem de cima para baixo.
O visit
método é livre para alterar qualquer coisa na construção. Em linguagens de tipagem forte, converta a construção recebida em um tipo mais específico antes de acessar propriedades ou métodos específicos da construção.
Os aspectos não se propagam além dos limites da Stage
construção, porque Stages
são independentes e imutáveis após a definição. Aplique aspectos na Stage
construção em si (ou inferior) se quiser que eles visitem construções dentro daStage
.
Exemplo
O exemplo a seguir confirma que todos os buckets criados na pilha têm o versionamento ativado. O aspecto adiciona uma anotação de erro às construções que falham na validação. Isso resulta na falha da synth operação e impede a implantação do conjunto de nuvem resultante.
- TypeScript
-
class BucketVersioningChecker implements IAspect {
public visit(node: IConstruct): void {
// See that we're dealing with a CfnBucket
if (node instanceof s3.CfnBucket) {
// Check for versioning property, exclude the case where the property
// can be a token (IResolvable).
if (!node.versioningConfiguration
|| (!Tokenization.isResolvable(node.versioningConfiguration)
&& node.versioningConfiguration.status !== 'Enabled')) {
Annotations.of(node).addError('Bucket versioning is not enabled');
}
}
}
}
// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
- JavaScript
-
class BucketVersioningChecker {
visit(node) {
// See that we're dealing with a CfnBucket
if ( node instanceof s3.CfnBucket) {
// Check for versioning property, exclude the case where the property
// can be a token (IResolvable).
if (!node.versioningConfiguration
|| !Tokenization.isResolvable(node.versioningConfiguration)
&& node.versioningConfiguration.status !== 'Enabled')) {
Annotations.of(node).addError('Bucket versioning is not enabled');
}
}
}
}
// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
- Python
-
@jsii.implements(cdk.IAspect)
class BucketVersioningChecker:
def visit(self, node):
# See that we're dealing with a CfnBucket
if isinstance(node, s3.CfnBucket):
# Check for versioning property, exclude the case where the property
# can be a token (IResolvable).
if (not node.versioning_configuration or
not Tokenization.is_resolvable(node.versioning_configuration)
and node.versioning_configuration.status != "Enabled"):
Annotations.of(node).add_error('Bucket versioning is not enabled')
# Later, apply to the stack
Aspects.of(stack).add(BucketVersioningChecker())
- Java
-
public class BucketVersioningChecker implements IAspect
{
@Override
public void visit(Construct node)
{
// See that we're dealing with a CfnBucket
if (node instanceof CfnBucket)
{
CfnBucket bucket = (CfnBucket)node;
Object versioningConfiguration = bucket.getVersioningConfiguration();
if (versioningConfiguration == null ||
!Tokenization.isResolvable(versioningConfiguration.toString()) &&
!versioningConfiguration.toString().contains("Enabled"))
Annotations.of(bucket.getNode()).addError("Bucket versioning is not enabled");
}
}
}
// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
- C#
-
class BucketVersioningChecker : Amazon.Jsii.Runtime.Deputy.DeputyBase, IAspect
{
public void Visit(IConstruct node)
{
// See that we're dealing with a CfnBucket
if (node is CfnBucket)
{
var bucket = (CfnBucket)node;
if (bucket.VersioningConfiguration is null ||
!Tokenization.IsResolvable(bucket.VersioningConfiguration) &&
!bucket.VersioningConfiguration.ToString().Contains("Enabled"))
Annotations.Of(bucket.Node).AddError("Bucket versioning is not enabled");
}
}
}
// Later, apply to the stack
Aspects.Of(stack).add(new BucketVersioningChecker());