Passen Sie Konstrukte aus der AWS Construct-Bibliothek an - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Die ältere CDK Version 1 wurde am 1. Juni 2022 in die Wartung aufgenommen und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Passen Sie Konstrukte aus der AWS Construct-Bibliothek an

Passen Sie Gebäudemodule aus der AWS Gebäudebibliothek mithilfe von Escape-Schraffuren, unverarbeiteten Überschreibungen und benutzerdefinierten Ressourcen an Ihre Bedürfnisse an.

Benutze Fluchtluken

Die AWS Construct Library bietet Konstrukte mit unterschiedlichen Abstraktionsebenen.

Auf der höchsten Ebene sind Ihre AWS CDK Anwendung und die darin enthaltenen Stapel selbst Abstraktionen Ihrer gesamten Cloud-Infrastruktur oder wesentlicher Teile davon. Sie können parametrisiert werden, um sie in verschiedenen Umgebungen oder für unterschiedliche Anforderungen bereitzustellen.

Abstraktionen sind leistungsstarke Tools für den Entwurf und die Implementierung von Cloud-Anwendungen. Das AWS CDK gibt Ihnen die Möglichkeit, nicht nur mit seinen Abstraktionen zu bauen, sondern auch neue Abstraktionen zu erstellen. Anhand der vorhandenen Open-Source-L2- und L3-Konstrukte können Sie Ihre eigenen L2- und L3-Konstrukte erstellen, die den bewährten Verfahren und Meinungen Ihrer eigenen Organisation entsprechen.

Keine Abstraktion ist perfekt, und selbst gute Abstraktionen können nicht jeden möglichen Anwendungsfall abdecken. Während der Entwicklung finden Sie möglicherweise ein Konstrukt, das Ihren Anforderungen fast entspricht und eine kleine oder große Anpassung erfordert.

Aus diesem Grund AWS CDK bietet das Möglichkeiten, aus dem Konstruktmodell auszubrechen. Dazu gehört der Übergang zu einer abstrakteren Ebene oder zu einem völlig anderen Modell. Mit Notluken können Sie dem AWS CDK Paradigma entfliehen und es so anpassen, dass es Ihren Bedürfnissen entspricht. Anschließend können Sie Ihre Änderungen in einem neuen Konstrukt zusammenfassen, um die zugrundeliegende Komplexität wegzunehmen und anderen Entwicklern eine Bereinigung API zu ermöglichen.

Im Folgenden finden Sie Beispiele für Situationen, in denen Sie Notluken verwenden können:

  • Eine AWS Service-Funktion ist über verfügbar AWS CloudFormation, aber es gibt keine L2-Konstrukte dafür.

  • Ein AWS Service-Feature ist über verfügbar AWS CloudFormation, und es gibt L2-Konstrukte für den Service, aber diese machen das Feature noch nicht verfügbar. Da L2-Konstrukte vom CDK Team kuratiert werden, sind sie möglicherweise nicht sofort für neue Funktionen verfügbar.

  • Die Funktion ist noch gar nicht verfügbar. AWS CloudFormation

    Informationen darüber, ob eine Funktion über verfügbar ist AWS CloudFormation, finden Sie in der Referenz zu AWS Ressourcen- und Eigenschaftstypen.

Entwickeln Sie Notluken für L1-Konstrukte

Wenn L2-Konstrukte für den Service nicht verfügbar sind, können Sie die automatisch generierten L1-Konstrukte verwenden. Diese Ressourcen können daran erkannt werden, dass ihr Name mit beginntCfn, z. B. oder. CfnBucket CfnRole Sie instanziieren sie genau so, wie Sie die entsprechende AWS CloudFormation Ressource verwenden würden.

Um beispielsweise einen Amazon S3 S3-Bucket L1 auf niedriger Ebene mit aktivierter Analytik zu instanziieren, würden Sie etwa Folgendes schreiben.

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", // ... } });

Es kann seltene Fälle geben, in denen Sie eine Ressource definieren möchten, für die es keine entsprechende Klasse gibt. CfnXxx Dies könnte ein neuer Ressourcentyp sein, der noch nicht in der AWS CloudFormation Ressourcenspezifikation veröffentlicht wurde. In solchen Fällen können Sie den cdk.CfnResource direkt instanziieren und den Ressourcentyp und die Eigenschaften angeben. Dies wird im folgenden Beispiel veranschaulicht.

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

Entwickeln Sie Fluchtluken für L2-Konstrukte

Wenn in einem L2-Konstrukt ein Feature fehlt oder Sie versuchen, ein Problem zu umgehen, können Sie das L1-Konstrukt ändern, das durch das L2-Konstrukt gekapselt ist.

Alle L2-Konstrukte enthalten das entsprechende L1-Konstrukt. Beispielsweise umschließt das Bucket Konstrukt auf hoher Ebene das Konstrukt auf niedriger Ebene. CfnBucket Da das direkt der AWS CloudFormation Ressource CfnBucket entspricht, macht es alle Funktionen verfügbar, die über verfügbar sind. AWS CloudFormation

Der grundlegende Ansatz, um Zugriff auf das L1-Konstrukt zu erhalten, besteht darin, construct.node.defaultChild (Python:default_child) zu verwenden, es in den richtigen Typ umzuwandeln (falls erforderlich) und seine Eigenschaften zu ändern. Nehmen wir noch einmal das Beispiel von a. 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", // ... } };

Sie können dieses Objekt auch verwenden, um AWS CloudFormation Optionen wie Metadata und zu ändernUpdatePolicy.

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" };

Verwenden Sie Luken, die nicht entkommen können

Das bietet AWS CDK auch die Möglichkeit, eine Abstraktionsebene zu erreichen, was wir als „Un-Escape-Luke“ bezeichnen könnten. Wenn Sie beispielsweise ein L1-Konstrukt haben, können Sie ein neues L2-Konstrukt (Bucketin diesem Fall) erstellenCfnBucket, um das L1-Konstrukt zu umschließen.

Dies ist praktisch, wenn Sie eine L1-Ressource erstellen, sie aber mit einem Konstrukt verwenden möchten, das eine L2-Ressource benötigt. Es ist auch hilfreich, wenn Sie praktische Methoden verwenden möchten, wie sie für .grantXxxxx() das L1-Konstrukt nicht verfügbar sind.

Sie wechseln zur höheren Abstraktionsebene, indem Sie eine statische Methode für die L2-Klasse verwenden, die aufgerufen wird .fromCfnXxxxx() — zum Beispiel Bucket.fromCfnBucket() für Amazon S3 S3-Buckets. Die L1-Ressource ist der einzige Parameter.

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

Aus L1-Konstrukten erstellte L2-Konstrukte sind Proxyobjekte, die auf die L1-Ressource verweisen, ähnlich denen, die aus Ressourcennamen oder Lookups erstellt wurden. ARNs Änderungen an diesen Konstrukten wirken sich nicht auf die endgültige synthetisierte AWS CloudFormation Vorlage aus (da Sie über die L1-Ressource verfügen, können Sie diese jedoch stattdessen ändern). Weitere Informationen zu Proxyobjekten finden Sie unter. Verweisen auf Ressourcen in Ihrem Konto AWS

Um Verwirrung zu vermeiden, sollten Sie nicht mehrere L2-Konstrukte erstellen, die sich auf dasselbe L1-Konstrukt beziehen. Wenn Sie beispielsweise Bucket mit der Technik CfnBucket aus dem vorherigen Abschnitt das aus einem extrahieren, sollten Sie keine zweite Bucket Instanz erstellen, indem Sie damit aufrufenBucket.fromCfnBucket(). CfnBucket Es funktioniert tatsächlich so, wie Sie es erwarten würden (nur eine AWS::S3::Bucket wird synthetisiert), aber es macht es schwieriger, Ihren Code zu verwalten.

Verwenden Sie rohe Überschreibungen

Wenn es Eigenschaften gibt, die im L1-Konstrukt fehlen, können Sie die gesamte Eingabe mithilfe von Rohüberschreibungen umgehen. Dadurch ist es auch möglich, synthetisierte Eigenschaften zu löschen.

Verwenden Sie eine der addOverride Methoden (Python:add_override), wie im folgenden Beispiel gezeigt.

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");

Verwenden Sie benutzerdefinierte Ressourcen

Wenn die Funktion nicht über AWS CloudFormation, sondern nur über einen direkten API Anruf verfügbar ist, müssen Sie eine AWS CloudFormation benutzerdefinierte Ressource schreiben, um den gewünschten API Anruf zu tätigen. Sie können die verwenden AWS CDK , um benutzerdefinierte Ressourcen zu schreiben und sie in eine reguläre Construct-Schnittstelle einzubinden. Aus der Sicht eines Anwenders Ihres Konstrukts wird sich das Erlebnis wie einheimisch anfühlen.

Das Erstellen einer benutzerdefinierten Ressource beinhaltet das Schreiben einer Lambda-Funktion, die auf die Ereignisse und DELETE Lebenszyklusereignisse einer Ressource reagiert. CREATE UPDATE Wenn Ihre benutzerdefinierte Ressource nur einen einzigen API Aufruf tätigen muss, sollten Sie die AwsCustomResourceverwenden. Dadurch ist es möglich, während einer AWS CloudFormation Bereitstellung beliebige SDK Aufrufe durchzuführen. Andernfalls sollten Sie Ihre eigene Lambda-Funktion schreiben, um die Arbeit auszuführen, die Sie erledigen müssen.

Das Thema ist zu weit gefasst, um es hier vollständig zu behandeln, aber die folgenden Links sollten Ihnen den Einstieg erleichtern: