Aspectos y AWS CDK - 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.

Aspectos y AWS CDK

Los aspectos son una forma de aplicar una operación a todos los constructos de un ámbito determinado. El aspecto podría modificar las construcciones, por ejemplo, añadiendo etiquetas. O podría verificar algo sobre el estado de las construcciones, como asegurarse de que todos los depósitos estén cifrados.

Para aplicar un aspecto a un componente fijo y a todos los componentes fijos del mismo ámbito, utilice un Aspects.of(SCOPE).add()aspecto nuevo, como se muestra en el siguiente ejemplo.

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 Utiliza aspectos para etiquetar recursos, pero el marco también se puede utilizar para otros fines. Por ejemplo, puede usarlo para validar o cambiar los AWS CloudFormation recursos que definan para usted las construcciones de nivel superior.

Aspectos en detalle

Los aspectos emplean el patrón de visitantes. Un aspecto es una clase que implementa la siguiente interfaz.

TypeScript
interface IAspect { visit(node: IConstruct): void;}
JavaScript

JavaScript no tiene interfaces como característica del lenguaje. Por lo tanto, un aspecto es simplemente una instancia de una clase que tiene un visit método que acepta el nodo en el que se va a operar.

Python

Python no tiene interfaces como característica del lenguaje. Por lo tanto, un aspecto es simplemente una instancia de una clase que tiene un visit método que acepta el nodo en el que se va a operar.

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) }

Al llamarAspects.of(SCOPE).add(...), la construcción añade el aspecto a una lista interna de aspectos. Puede obtener la lista conAspects.of(SCOPE).

Durante la fase de preparación, AWS CDK llama al visit método del objeto para la construcción y a cada uno de sus elementos secundarios en orden descendente.

El visit método es libre de cambiar cualquier elemento de la construcción. En lenguajes fuertemente tipados, convierta la construcción recibida en un tipo más específico antes de acceder a las propiedades o métodos específicos de la construcción.

Los aspectos no se propagan a través de los límites de los Stage constructos, porque Stages son autónomos e inmutables después de la definición. Aplica los aspectos en el propio componente Stage fijo (o en una parte inferior) si quieres que visiten los componentes fijos que se encuentran dentro del. Stage

Ejemplo

El siguiente ejemplo valida que todos los depósitos creados en la pila tengan activado el control de versiones. El aspecto añade una anotación de error a las construcciones que no superan la validación. Esto provoca un error en la synth operación e impide implementar el ensamblaje de nube 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());