Beispiel: Eine CDK App mit mehreren Stacks erstellen - 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.

Beispiel: Eine CDK App mit mehreren Stacks erstellen

Sie können eine AWS Cloud Development Kit (AWS CDK) Anwendung erstellen, die mehrere Stacks enthält. Wenn Sie die AWS CDK App bereitstellen, wird jeder Stapel zu einer eigenen AWS CloudFormation Vorlage. Mit dem AWS CDK CLI cdk deploy Befehl können Sie auch jeden Stack einzeln synthetisieren und bereitstellen.

In diesem Beispiel behandeln wir Folgendes:

  • Wie man die Stack Klasse erweitert, um neue Eigenschaften oder Argumente zu akzeptieren.

  • Wie man Eigenschaften verwendet, um festzustellen, welche Ressourcen der Stack enthält und wie sie konfiguriert sind.

  • Wie instanziiert man mehrere Stacks aus dieser Klasse.

Das Beispiel in diesem Thema verwendet eine boolesche Eigenschaft mit dem Namen encryptBucket (Python:encrypt_bucket). Es gibt an, ob ein Amazon S3 S3-Bucket verschlüsselt werden soll. Wenn ja, ermöglicht der Stack die Verschlüsselung mithilfe eines Schlüssels, der von AWS Key Management Service (AWS KMS) verwaltet wird. Die App erstellt zwei Instanzen dieses Stacks, eine mit Verschlüsselung und eine ohne.

Voraussetzungen

In diesem Beispiel wird davon ausgegangen, dass alle Schritte für die ersten Schritte abgeschlossen wurden.

Erstellen Sie ein CDK Projekt

Zunächst erstellen wir ein CDK Projekt mit dem CDKCLI:

TypeScript
mkdir multistack cd multistack cdk init --language=typescript
JavaScript
mkdir multistack cd multistack cdk init --language=javascript
Python
mkdir multistack cd multistack cdk init --language=python source .venv/bin/activate # On Windows, run '.\venv\Scripts\activate' instead pip install -r requirements.txt
Java
mkdir multistack cd multistack cdk init --language=java

Sie können das resultierende Maven-Projekt in Ihr Java IDE importieren.

C#
mkdir multistack cd multistack cdk init --language=csharp

Sie können die Datei src/Pipeline.sln in Visual Studio öffnen.

Fügen Sie einen optionalen Parameter hinzu

Das props Argument des Stack Konstruktors erfüllt die Schnittstelle. StackProps In diesem Beispiel möchten wir, dass der Stack eine zusätzliche Eigenschaft akzeptiert, die uns mitteilt, ob der Amazon S3 S3-Bucket verschlüsselt werden soll. Dazu erstellen wir eine Schnittstelle oder Klasse, die die Eigenschaft enthält. Dadurch kann der Compiler sicherstellen, dass die Eigenschaft einen booleschen Wert hat, und aktiviert die automatische Vervollständigung dafür in Ihrem. IDE

Wir öffnen unsere Stack-Datei in unserem Editor IDE oder und fügen die neue Schnittstelle, Klasse oder das neue Argument hinzu. Neue Zeilen sind fett hervorgehoben:

TypeScript

Datei: lib/multistack-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; interface MultiStackProps extends cdk.StackProps { encryptBucket?: boolean; } export class MultistackStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: MultiStackProps) { super(scope, id, props); // The code that defines our stack goes here } }
JavaScript

Datei: lib/multistack-stack.js

JavaScript hat keine Schnittstellenfunktion; wir müssen keinen Code hinzufügen.

const cdk = require('aws-cdk-stack'); class MultistackStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // The code that defines our stack goes here } } module.exports = { MultistackStack }
Python

Datei: multistack/multistack_stack.py

Python hat keine Schnittstellenfunktion, daher erweitern wir unseren Stack so, dass er die neue Eigenschaft akzeptiert, indem wir ein Schlüsselwortargument hinzufügen.

import aws_cdk as cdk from constructs import Construct class MultistackStack(cdk.Stack): # The Stack class doesn't know about our encrypt_bucket parameter, # so accept it separately and pass along any other keyword arguments. def __init__(self, scope: Construct, id: str, *, encrypt_bucket=False, **kwargs) -> None: super().__init__(scope, id, **kwargs) # The code that defines our stack goes here
Java

Datei: src/main/java/com/myorg/MultistackStack.java

Es ist komplizierter, als wir wirklich wollen, einen Requisitentyp in Java zu erweitern. Schreiben Sie stattdessen den Konstruktor des Stacks so, dass er einen optionalen booleschen Parameter akzeptiert. Da props es sich um ein optionales Argument handelt, schreiben wir einen zusätzlichen Konstruktor, mit dem Sie ihn überspringen können. Standardmäßig ist es. false

package com.myorg; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.constructs.Construct; import software.amazon.awscdk.services.s3.Bucket; public class MultistackStack extends Stack { // additional constructors to allow props and/or encryptBucket to be omitted public MultistackStack(final Construct scope, final String id, boolean encryptBucket) { this(scope, id, null, encryptBucket); } public MultistackStack(final Construct scope, final String id) { this(scope, id, null, false); } public MultistackStack(final Construct scope, final String id, final StackProps props, final boolean encryptBucket) { super(scope, id, props); // The code that defines our stack goes here } }
C#

Datei: src/Multistack/MultistackStack.cs

using Amazon.CDK; using constructs; namespace Multistack { public class MultiStackProps : StackProps { public bool? EncryptBucket { get; set; } } public class MultistackStack : Stack { public MultistackStack(Construct scope, string id, MultiStackProps props) : base(scope, id, props) { // The code that defines our stack goes here } } }

Die neue Eigenschaft ist optional. Wenn encryptBucket (Python:encrypt_bucket) nicht vorhanden istundefined, ist sein Wert oder das lokale Äquivalent. Der Bucket wird standardmäßig unverschlüsselt sein.

Definieren Sie die Stack-Klasse

Als Nächstes definieren wir unsere Stack-Klasse mithilfe unserer neuen Eigenschaft. Neuer Code ist fett hervorgehoben:

TypeScript

Datei: lib/multistack-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from constructs; import * as s3 from 'aws-cdk-lib/aws-s3'; interface MultistackProps extends cdk.StackProps { encryptBucket?: boolean; } export class MultistackStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: MultistackProps) { super(scope, id, props); // Add a Boolean property "encryptBucket" to the stack constructor. // If true, creates an encrypted bucket. Otherwise, the bucket is unencrypted. // Encrypted bucket uses KMS-managed keys (SSE-KMS). if (props && props.encryptBucket) { new s3.Bucket(this, "MyGroovyBucket", { encryption: s3.BucketEncryption.KMS_MANAGED, removalPolicy: cdk.RemovalPolicy.DESTROY }); } else { new s3.Bucket(this, "MyGroovyBucket", { removalPolicy: cdk.RemovalPolicy.DESTROY}); } } }
JavaScript

Datei: lib/multistack-stack.js

const cdk = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class MultistackStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // Add a Boolean property "encryptBucket" to the stack constructor. // If true, creates an encrypted bucket. Otherwise, the bucket is unencrypted. // Encrypted bucket uses KMS-managed keys (SSE-KMS). if ( props && props.encryptBucket) { new s3.Bucket(this, "MyGroovyBucket", { encryption: s3.BucketEncryption.KMS_MANAGED, removalPolicy: cdk.RemovalPolicy.DESTROY }); } else { new s3.Bucket(this, "MyGroovyBucket", { removalPolicy: cdk.RemovalPolicy.DESTROY}); } } } module.exports = { MultistackStack }
Python

Datei: multistack/multistack_stack.py

import aws_cdk as cdk from constructs import Construct from aws_cdk import aws_s3 as s3 class MultistackStack(cdk.Stack): # The Stack class doesn't know about our encrypt_bucket parameter, # so accept it separately and pass along any other keyword arguments. def __init__(self, scope: Construct, id: str, *, encrypt_bucket=False, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Add a Boolean property "encryptBucket" to the stack constructor. # If true, creates an encrypted bucket. Otherwise, the bucket is unencrypted. # Encrypted bucket uses KMS-managed keys (SSE-KMS). if encrypt_bucket: s3.Bucket(self, "MyGroovyBucket", encryption=s3.BucketEncryption.KMS_MANAGED, removal_policy=cdk.RemovalPolicy.DESTROY) else: s3.Bucket(self, "MyGroovyBucket", removal_policy=cdk.RemovalPolicy.DESTROY)
Java

Datei: src/main/java/com/myorg/MultistackStack.java

package com.myorg; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.constructs.Construct; import software.amazon.awscdk.RemovalPolicy; import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.s3.BucketEncryption; public class MultistackStack extends Stack { // additional constructors to allow props and/or encryptBucket to be omitted public MultistackStack(final Construct scope, final String id, boolean encryptBucket) { this(scope, id, null, encryptBucket); } public MultistackStack(final Construct scope, final String id) { this(scope, id, null, false); } // main constructor public MultistackStack(final Construct scope, final String id, final StackProps props, final boolean encryptBucket) { super(scope, id, props); // Add a Boolean property "encryptBucket" to the stack constructor. // If true, creates an encrypted bucket. Otherwise, the bucket is // unencrypted. Encrypted bucket uses KMS-managed keys (SSE-KMS). if (encryptBucket) { Bucket.Builder.create(this, "MyGroovyBucket") .encryption(BucketEncryption.KMS_MANAGED) .removalPolicy(RemovalPolicy.DESTROY).build(); } else { Bucket.Builder.create(this, "MyGroovyBucket") .removalPolicy(RemovalPolicy.DESTROY).build(); } } }
C#

Datei: src/Multistack/MultistackStack.cs

using Amazon.CDK; using Amazon.CDK.AWS.S3; namespace Multistack { public class MultiStackProps : StackProps { public bool? EncryptBucket { get; set; } } public class MultistackStack : Stack { public MultistackStack(Construct scope, string id, IMultiStackProps props = null) : base(scope, id, props) { // Add a Boolean property "EncryptBucket" to the stack constructor. // If true, creates an encrypted bucket. Otherwise, the bucket is unencrypted. // Encrypted bucket uses KMS-managed keys (SSE-KMS). if (props?.EncryptBucket ?? false) { new Bucket(this, "MyGroovyBucket", new BucketProps { Encryption = BucketEncryption.KMS_MANAGED, RemovalPolicy = RemovalPolicy.DESTROY }); } else { new Bucket(this, "MyGroovyBucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); } } } }

Erstellen Sie zwei Stack-Instanzen

In unserer Anwendungsdatei fügen wir den Code hinzu, um zwei separate Stapel zu instanziieren. Wir löschen die bestehende MultistackStack Definition und definieren unsere beiden Stapel. Der neue Code ist fett hervorgehoben:

TypeScript

Datei: bin/multistack.ts

#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { MultistackStack } from '../lib/multistack-stack'; const app = new cdk.App(); new MultistackStack(app, "MyWestCdkStack", { env: {region: "us-west-1"}, encryptBucket: false }); new MultistackStack(app, "MyEastCdkStack", { env: {region: "us-east-1"}, encryptBucket: true }); app.synth();
JavaScript

Datei: bin/multistack.js

#!/usr/bin/env node const cdk = require('aws-cdk-lib'); const { MultistackStack } = require('../lib/multistack-stack'); const app = new cdk.App(); new MultistackStack(app, "MyWestCdkStack", { env: {region: "us-west-1"}, encryptBucket: false }); new MultistackStack(app, "MyEastCdkStack", { env: {region: "us-east-1"}, encryptBucket: true }); app.synth();
Python

Datei: ./app.py

#!/usr/bin/env python3 import aws_cdk as cdk from multistack.multistack_stack import MultistackStack app = cdk.App() MultistackStack(app, "MyWestCdkStack", env=cdk.Environment(region="us-west-1"), encrypt_bucket=False) MultistackStack(app, "MyEastCdkStack", env=cdk.Environment(region="us-east-1"), encrypt_bucket=True) app.synth()
Java

Datei: src/main/java/com/myorg/MultistackApp.java

package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Environment; import software.amazon.awscdk.StackProps; public class MultistackApp { public static void main(final String argv[]) { App app = new App(); new MultistackStack(app, "MyWestCdkStack", StackProps.builder() .env(Environment.builder() .region("us-west-1") .build()) .build(), false); new MultistackStack(app, "MyEastCdkStack", StackProps.builder() .env(Environment.builder() .region("us-east-1") .build()) .build(), true); app.synth(); } }
C#

Datei: src/Multistack/Program.cs

using Amazon.CDK; namespace Multistack { class Program { static void Main(string[] args) { var app = new App(); new MultistackStack(app, "MyWestCdkStack", new MultiStackProps { Env = new Environment { Region = "us-west-1" }, EncryptBucket = false }); new MultistackStack(app, "MyEastCdkStack", new MultiStackProps { Env = new Environment { Region = "us-east-1" }, EncryptBucket = true }); app.Synth(); } } }

Dieser Code verwendet die neue encryptBucket (Python:encrypt_bucket) -Eigenschaft der MultistackStack Klasse, um Folgendes zu instanziieren:

  • Ein Stapel mit einem verschlüsselten Amazon S3 S3-Bucket in der us-east-1 AWS Region.

  • Ein Stapel mit einem unverschlüsselten Amazon S3 S3-Bucket in der us-west-1 AWS Region.

Synthetisieren Sie den Stack und stellen Sie ihn bereit

Als Nächstes können wir Stacks aus der App bereitstellen. Zuerst synthetisieren wir eine AWS CloudFormation Vorlage für. MyEastCdkStack Dies ist der Stack us-east-1 mit dem verschlüsselten Amazon S3 S3-Bucket.

$ cdk synth MyEastCdkStack

Um diesen Stack in unserer AWS Umgebung bereitzustellen, können wir einen der folgenden Befehle ausführen. Der erste Befehl verwendet unser AWS Standardprofil, um die Anmeldeinformationen für die Bereitstellung des Stacks abzurufen. Der zweite verwendet ein Profil, das wir angeben. Wählen Sie in der &Snowconsole; Ihren Auftrag aus der Tabelle. PROFILE_NAME, können wir durch den Namen eines AWS CLI Profils ersetzen, das die entsprechenden Anmeldeinformationen für die Bereitstellung auf dem enthält us-east-1 AWS-Region.

$ cdk deploy MyEastCdkStack
$ cdk deploy MyEastCdkStack --profile=PROFILE_NAME

Bereinigen

Um Gebühren für die von uns bereitgestellten Ressourcen zu vermeiden, löschen wir den Stack mit dem folgenden Befehl:

cdk destroy MyEastCdkStack

Der Löschvorgang schlägt fehl, wenn im Bucket des Stacks etwas gespeichert ist. Das sollte nicht der Fall sein, da wir nur den Bucket erstellt haben. Wenn wir etwas in den Bucket gelegt haben, müssen wir den Bucket-Inhalt löschen, bevor wir den Stapel zerstören. Wir können das AWS Management Console oder das verwenden AWS CLI , um den Inhalt des Buckets zu löschen.