Anpassen von Konstrukten aus der AWS Construct Library - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 gewartet 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.

Anpassen von Konstrukten aus der AWS Construct Library

Passen Sie Konstrukte aus der AWS Construct Library mithilfe von Escape-Schraffuren, Rohüberschreibungen und benutzerdefinierten Ressourcen an.

Verwenden von Escape-Schraffuren

Die AWS Construct Library bietet Konstrukte unterschiedlicher Abstraktionsstufen.

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

Abstraktionen sind leistungsstarke Tools zum Entwerfen und Implementieren von Cloud-Anwendungen. Die AWS CDK bietet Ihnen nicht nur die Möglichkeit, mit ihren Abstraktionen zu erstellen, sondern auch neue Abstraktionen zu erstellen. Mithilfe der vorhandenen Open-Source-L2- und L3-Konstrukte als Leitfaden können Sie Ihre eigenen L2- und L3-Konstrukte erstellen, um die bewährten Methoden und Meinungen Ihrer eigenen Organisation widerzuspiegeln.

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 fast Ihren Anforderungen entspricht und eine kleine oder große Anpassung erfordert.

Aus diesem Grund AWS CDK bietet die Möglichkeiten, das Konstruktmodell zu verlassen. Dazu gehört der Wechsel zu einer Abstraktion auf niedrigerer Ebene oder zu einem anderen Modell. Mit Escape-Schraffuren können Sie das AWS CDK Paradigma umgehen und es an Ihre Bedürfnisse anpassen. Anschließend können Sie Ihre Änderungen in ein neues Konstrukt einpacken, um die zugrunde liegende Komplexität zu abstrahieren und eine saubere API für andere Entwickler bereitzustellen.

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

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

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

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

    Informationen dazu, ob ein Feature über verfügbar ist AWS CloudFormation, finden Sie unter AWS Ressourcen- und Eigenschaftstypen – Referenz.

Entwickeln von Escape-Schraffuren für L1-Konstrukte

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

Um beispielsweise einen Low-Level-Amazon S3-Bucket L1 mit aktivierter Analyse zu instanziieren, würden Sie etwas wie das Folgende schreiben.

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

Es kann selten vorkommen, dass Sie eine Ressource definieren möchten, die keine entsprechende CfnXxx Klasse hat. 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 die cdk.CfnResource direkt instanziieren und den Ressourcentyp und die Eigenschaften angeben. Dies wird im folgenden Beispiel veranschaulicht.

TypeScript
new cdk.CfnResource(this, 'MyBucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config', // ... } ] } });
JavaScript
new cdk.CfnResource(this, 'MyBucket', { type: 'AWS::S3::Bucket', properties: { // Note the PascalCase here! These are CloudFormation identifiers. AnalyticsConfigurations: [ { Id: 'Config' // ... } ] } });
Python
cdk.CfnResource(self, 'MyBucket', type="AWS::S3::Bucket", properties=dict( # Note the PascalCase here! These are CloudFormation identifiers. "AnalyticsConfigurations": [ { "Id": "Config", # ... } ] } )
Java
CfnResource.Builder.create(this, "MyBucket") .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, "MyBucket", 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 von Escape-Schraffuren für L2-Konstrukte

Wenn 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 darin das entsprechende L1-Konstrukt. Beispielsweise umschließt das High-Level-BucketKonstrukt das Low-Level-CfnBucketKonstrukt. Da der direkt der AWS CloudFormation Ressource CfnBucket entspricht, werden alle Funktionen bereitgestellt, 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. Betrachten wir erneut das Beispiel eines 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" };

Escape-Schraffuren entfernen

Die bietet AWS CDK auch die Möglichkeit, eine Abstraktionsstufe zu erreichen, die wir möglicherweise als „Entflief“-Schraffur bezeichnen. Wenn Sie ein L1-Konstrukt haben, z. B. CfnBucket, können Sie ein neues L2-Konstrukt (Bucketin diesem Fall) erstellen, 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 erfordert. Es ist auch hilfreich, wenn Sie Convenience-Methoden wie verwenden möchten.grantXxxxx(), die auf dem L1-Konstrukt nicht verfügbar sind.

Sie wechseln mit einer statischen Methode in der L2-Klasse auf die höhere Abstraktionsstufe, z. B. Bucket.fromCfnBucket() für Amazon S3.fromCfnXxxxx()-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);

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

Um Verwirrung zu vermeiden, erstellen Sie nicht mehrere L2-Konstrukte, die sich auf dasselbe L1-Konstrukt beziehen. Wenn Sie beispielsweise das Bucket mit der -Technik im vorherigen Abschnitt CfnBucket aus einem extrahieren, sollten Sie keine zweite Instance erstellen, Bucket indem Sie Bucket.fromCfnBucket() mit diesem aufrufenCfnBucket. Entwickeln von Escape-Schraffuren für L2-Konstrukte Es funktioniert tatsächlich wie erwartet (nur einer AWS::S3::Bucket ist synthetisiert), aber es macht Ihren Code schwieriger zu verwalten.

Rohüberschreibungen

Wenn Eigenschaften im L1-Konstrukt fehlen, können Sie die gesamte Typisierung 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");

Benutzerdefinierte Ressourcen

Wenn die Funktion nicht über AWS CloudFormation, sondern nur über einen direkten API-Aufruf verfügbar ist, müssen Sie eine AWS CloudFormation benutzerdefinierte -Ressource schreiben, um den benötigten API-Aufruf durchzuführen. Sie können die verwenden AWS CDK , um benutzerdefinierte Ressourcen zu schreiben und sie in eine reguläre Konstruktschnittstelle zu packen. Aus Sicht eines Konsumenten Ihres Konstrukts wird sich die Erfahrung nativ anhören.

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

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