Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Personalice los componentes fijos de la biblioteca de AWS componentes

Modo de enfoque
Personalice los componentes fijos de la biblioteca de AWS componentes - AWS Cloud Development Kit (AWS CDK) v2

Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde 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.

Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde 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.

Personalice las construcciones de la biblioteca de AWS construcciones mediante trampillas de escape, anulaciones sin procesar y recursos personalizados.

Utilice escotillas de escape

La biblioteca AWS Construct proporciona construcciones con distintos niveles de abstracción.

En el nivel más alto, la AWS CDK aplicación y las pilas que contiene son en sí mismas abstracciones de toda la infraestructura de nube o de partes importantes de la misma. Se pueden parametrizar para implementarlas en diferentes entornos o para diferentes necesidades.

Las abstracciones son herramientas potentes para diseñar e implementar aplicaciones en la nube. AWS CDK Esto le da la posibilidad no solo de construir con sus abstracciones, sino también de crear nuevas abstracciones. A partir de los constructos L2 y L3 de código abierto existentes, puede crear sus propios constructos L2 y L3 para reflejar las prácticas recomendadas y las opiniones de su propia organización.

Ninguna abstracción es perfecta, e incluso aquellas que son buenas no pueden abarcar todos los casos de uso posibles. Durante el desarrollo, es posible que encuentre un constructo que casi se adapte a sus necesidades, pero que requiera una pequeña o gran personalización.

Por esta razón, AWS CDK proporciona formas de romper con el modelo de construcción. Esto incluye pasar a una abstracción de bajo nivel o a un modelo completamente diferente. Las trampillas de escape te permiten escapar del AWS CDK paradigma y personalizarlo de forma que se adapte a tus necesidades. Luego, puede agrupar los cambios en un nuevo constructo para abstraer la complejidad subyacente y proporcionar una API limpia para otros desarrolladores.

Los siguientes son ejemplos de situaciones en las que puede utilizar escotillas de escape:

  • Hay una función de AWS servicio disponible AWS CloudFormation, pero no hay ninguna estructura de nivel 2 para ella.

  • Una función AWS de servicio está disponible a través del servicio AWS CloudFormation, y existen estructuras de nivel 2 para el servicio, pero estas aún no exponen la función. Como los constructos L2 los selecciona el equipo CDK, es posible que no estén disponibles de forma inmediata para las características.

  • La función aún no está disponible AWS CloudFormation en absoluto.

    Para determinar si una función está disponible a través de ella AWS CloudFormation, consulte la Referencia de tipos de AWS recursos y propiedades.

Desarrolle escotillas de escape para los constructos L1

Si los constructos L2 no están disponibles para el servicio, puede utilizar constructos L1 generados automáticamente. Estos recursos se pueden reconocer por su nombre que comienza con Cfn, como CfnBucket o CfnRole. Las instancias exactamente como usarías el recurso equivalente AWS CloudFormation .

Por ejemplo, para instanciar un bucket L1 de Amazon S3 de bajo nivel con el análisis habilitado, deber escribir algo similar a lo siguiente.

TypeScript
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config', // ... } ] });
JavaScript
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config' // ... } ] });
Python
s3.CfnBucket(self, "amzn-s3-demo-bucket", analytics_configurations: [ dict(id="Config", # ... ) ] )
Java
CfnBucket.Builder.create(this, "amzn-s3-demo-bucket") .analyticsConfigurations(Arrays.asList(java.util.Map.of( // Java 9 or later "id", "Config", // ... ))).build();
C#
new CfnBucket(this, 'amzn-s3-demo-bucket', new CfnBucketProps { AnalyticsConfigurations = new Dictionary<string, string> { ["id"] = "Config", // ... } });
new s3.CfnBucket(this, 'amzn-s3-demo-bucket', { analyticsConfigurations: [ { id: 'Config', // ... } ] });

En raras ocasiones, puede que desee definir un recurso que no tenga una clase CfnXxx correspondiente. Podría tratarse de un nuevo tipo de recurso que aún no se ha publicado en la especificación del AWS CloudFormation recurso. En estos casos, puede instanciar el cdk.CfnResource directamente y especificar el tipo y las propiedades del recurso. Esto se muestra en el siguiente ejemplo.

TypeScript
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });
JavaScript
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config' // ... } ] } });
Python
cdk.CfnResource(self, 'amzn-s3-demo-bucket', type="AWS::S3::Bucket", properties=dict( # Note the PascalCase here! These are CloudFormation identifiers. "AnalyticsConfigurations": [ { "Id": "Config", # ... } ] } )
Java
CfnResource.Builder.create(this, "amzn-s3-demo-bucket") .type("AWS::S3::Bucket") .properties(java.util.Map.of( // Map.of requires Java 9 or later // Note the PascalCase here! These are CloudFormation identifiers "AnalyticsConfigurations", Arrays.asList( java.util.Map.of("Id", "Config", // ... )))) .build();
C#
new CfnResource(this, "amzn-s3-demo-bucket", new CfnResourceProps { Type = "AWS::S3::Bucket", Properties = new Dictionary<string, object> { // Note the PascalCase here! These are CloudFormation identifiers ["AnalyticsConfigurations"] = new Dictionary<string, string>[] { new Dictionary<string, string> { ["Id"] = "Config" } } } });
new cdk.CfnResource(this, 'amzn-s3-demo-bucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });

Desarrolle escotillas de escape para los constructos L2

Si a un constructo L2 le falta una característica o está tratando de solucionar un problema, puede modificar el constructo L1 que está encapsulado por el constructo L2.

Todos los constructos L2 contienen el constructo L1 correspondiente. Por ejemplo, el constructo Bucket de alto nivel contiene el constructo CfnBucket de bajo nivel. Como CfnBucket corresponde directamente al AWS CloudFormation recurso, expone todas las funciones que están disponibles en él. AWS CloudFormation

El enfoque básico para acceder al constructo L1 es usar construct.node.defaultChild (Python: default_child), convertirlo en el tipo correcto (si es necesario) y modificar sus propiedades. Volvamos a tomar el ejemplo de un Bucket.

TypeScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config', // ... } ];
JavaScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config' // ... } ];
Python
# Get the CloudFormation resource cfn_bucket = bucket.node.default_child # Change its properties cfn_bucket.analytics_configuration = [ { "id": "Config", # ... } ]
Java
// Get the CloudFormation resource CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild(); cfnBucket.setAnalyticsConfigurations( Arrays.asList(java.util.Map.of( // Java 9 or later "Id", "Config", // ... ));
C#
// Get the CloudFormation resource var cfnBucket = (CfnBucket)bucket.Node.DefaultChild; cfnBucket.AnalyticsConfigurations = new List<object> { new Dictionary<string, string> { ["Id"] = "Config", // ... } };
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Change its properties cfnBucket.analyticsConfiguration = [ { id: 'Config', // ... } ];

También puede usar este objeto para cambiar AWS CloudFormation opciones como Metadata yUpdatePolicy.

TypeScript
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };
JavaScript
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };
Python
cfn_bucket.cfn_options.metadata = { "MetadataKey": "MetadataValue" }
Java
cfnBucket.getCfnOptions().setMetadata(java.util.Map.of( // Java 9+ "MetadataKey", "Metadatavalue"));
C#
cfnBucket.CfnOptions.Metadata = new Dictionary<string, object> { ["MetadataKey"] = "Metadatavalue" };
cfnBucket.cfnOptions.metadata = { MetadataKey: 'MetadataValue' };

Utilice escotillas sin escape

AWS CDK También proporciona la capacidad de subir un nivel de abstracción, al que podríamos denominar trampilla «sin salida». Si tiene un constructo L1, por ejemplo CfnBucket, puede crear un constructo L2 nuevo (Bucket en este caso) para incluir el constructo L1.

Esto resulta práctico cuando se crea un recurso L1, pero se quiere utilizar con un constructo que requiere un recurso L2. También resulta útil cuando se quieren utilizar métodos prácticos como .grantXxxxx(), que no están disponibles en el constructo L1.

Se pasa al nivel superior de abstracción mediante un método estático en la clase L2 denominado .fromCfnXxxxx(), por ejemplo: Bucket.fromCfnBucket() para los buckets de Amazon S3. El recurso L1 es el único parámetro.

TypeScript
b1 = new s3.CfnBucket(this, "buck09", { ... }); b2 = s3.Bucket.fromCfnBucket(b1);
JavaScript
b1 = new s3.CfnBucket(this, "buck09", { ...} ); b2 = s3.Bucket.fromCfnBucket(b1);
Python
b1 = s3.CfnBucket(self, "buck09", ...) b2 = s3.from_cfn_bucket(b1)
Java
CfnBucket b1 = CfnBucket.Builder.create(this, "buck09") // .... .build(); IBucket b2 = Bucket.fromCfnBucket(b1);
C#
var b1 = new CfnBucket(this, "buck09", new CfnBucketProps { ... }); var v2 = Bucket.FromCfnBucket(b1);
b1 = new s3.CfnBucket(this, "buck09", { ... }); b2 = s3.Bucket.fromCfnBucket(b1);

Las construcciones L2 creadas a partir de las construcciones L1 son objetos proxy que hacen referencia al recurso L1, similares a los que se crean a partir de nombres de recursos o búsquedas. ARNs Las modificaciones de estos constructos no afectan a la plantilla sintetizada AWS CloudFormation final (sin embargo, dado que tiene el recurso L1, puede modificarla desde aquí). Para obtener más información sobre los objetos proxy, consulte Haciendo referencia a los recursos de tu cuenta AWS.

Para evitar confusiones, no cree varios constructos L2 que hagan referencia al mismo constructo L1. Por ejemplo, si extrae el CfnBucket de un Bucket mediante la técnica de la sección anterior, no debería crear una segunda instancia Bucket llamando a Bucket.fromCfnBucket() con ese CfnBucket. De hecho, funciona como era de esperar (se sintetiza solo un AWS::S3::Bucket), pero dificulta el mantenimiento del código.

Use anulaciones sin procesar

Si faltan propiedades en el constructo L1, puede omitir todo tipo de escritura mediante anulaciones sin procesar. Esto también permite eliminar las propiedades sintetizadas.

Use uno de los métodos addOverride (Python: add_override), como se muestra en el siguiente ejemplo.

TypeScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');
JavaScript
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild ; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');
Python
# Get the CloudFormation resource cfn_bucket = bucket.node.default_child # Use dot notation to address inside the resource template fragment cfn_bucket.add_override("Properties.VersioningConfiguration.Status", "NewStatus") cfn_bucket.add_deletion_override("Properties.VersioningConfiguration.Status") # use index (0 here) to address an element of a list cfn_bucket.add_override("Properties.Tags.0.Value", "NewValue") cfn_bucket.add_deletion_override("Properties.Tags.0") # addPropertyOverride is a convenience function for paths starting with "Properties." cfn_bucket.add_property_override("VersioningConfiguration.Status", "NewStatus") cfn_bucket.add_property_deletion_override("VersioningConfiguration.Status") cfn_bucket.add_property_override("Tags.0.Value", "NewValue") cfn_bucket.add_property_deletion_override("Tags.0")
Java
// Get the CloudFormation resource CfnBucket cfnBucket = (CfnBucket)bucket.getNode().getDefaultChild(); // Use dot notation to address inside the resource template fragment cfnBucket.addOverride("Properties.VersioningConfiguration.Status", "NewStatus"); cfnBucket.addDeletionOverride("Properties.VersioningConfiguration.Status"); // use index (0 here) to address an element of a list cfnBucket.addOverride("Properties.Tags.0.Value", "NewValue"); cfnBucket.addDeletionOverride("Properties.Tags.0"); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride("VersioningConfiguration.Status", "NewStatus"); cfnBucket.addPropertyDeletionOverride("VersioningConfiguration.Status"); cfnBucket.addPropertyOverride("Tags.0.Value", "NewValue"); cfnBucket.addPropertyDeletionOverride("Tags.0");
C#
// Get the CloudFormation resource var cfnBucket = (CfnBucket)bucket.node.defaultChild; // Use dot notation to address inside the resource template fragment cfnBucket.AddOverride("Properties.VersioningConfiguration.Status", "NewStatus"); cfnBucket.AddDeletionOverride("Properties.VersioningConfiguration.Status"); // use index (0 here) to address an element of a list cfnBucket.AddOverride("Properties.Tags.0.Value", "NewValue"); cfnBucket.AddDeletionOverride("Properties.Tags.0"); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.AddPropertyOverride("VersioningConfiguration.Status", "NewStatus"); cfnBucket.AddPropertyDeletionOverride("VersioningConfiguration.Status"); cfnBucket.AddPropertyOverride("Tags.0.Value", "NewValue"); cfnBucket.AddPropertyDeletionOverride("Tags.0");
// Get the CloudFormation resource const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; // Use dot notation to address inside the resource template fragment cfnBucket.addOverride('Properties.VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addDeletionOverride('Properties.VersioningConfiguration.Status'); // use index (0 here) to address an element of a list cfnBucket.addOverride('Properties.Tags.0.Value', 'NewValue'); cfnBucket.addDeletionOverride('Properties.Tags.0'); // addPropertyOverride is a convenience function for paths starting with "Properties." cfnBucket.addPropertyOverride('VersioningConfiguration.Status', 'NewStatus'); cfnBucket.addPropertyDeletionOverride('VersioningConfiguration.Status'); cfnBucket.addPropertyOverride('Tags.0.Value', 'NewValue'); cfnBucket.addPropertyDeletionOverride('Tags.0');

Utilice recursos personalizados

Si la función no está disponible mediante una llamada directa a la API AWS CloudFormation, sino solo a través de ella, debes escribir un recurso AWS CloudFormation personalizado para realizar la llamada a la API que necesitas. Puedes usarlo AWS CDK para escribir recursos personalizados y agruparlos en una interfaz de construcción normal. Desde la perspectiva de un consumidor de su constructo, la experiencia será nativa.

La creación de un recurso personalizado implica escribir una función de Lambda que responda a los eventos del ciclo de vida CREATE, UPDATE y DELETE de un recurso. Si su recurso personalizado solo necesita realizar una llamada a la API, considere la posibilidad de utilizar el AwsCustomResource. Esto permite realizar llamadas arbitrarias al SDK durante una AWS CloudFormation implementación. De lo contrario, deberá escribir su propia función de Lambda para realizar el trabajo que necesita.

El tema es demasiado extenso para abarcarlo por completo aquí, pero puede empezar por los siguientes enlaces:

PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.