Esempio: creare un'CDKapp con più stack - AWS Cloud Development Kit (AWS CDK) v2

Questa è la guida per sviluppatori AWS CDK v2. La versione precedente della CDK versione 1 è entrata in manutenzione il 1° giugno 2022 e ha terminato il supporto il 1° giugno 2023.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esempio: creare un'CDKapp con più stack

È possibile creare un' AWS Cloud Development Kit (AWS CDK) applicazione contenente più stack. Quando distribuisci l' AWS CDK app, ogni stack diventa un modello a sé stante. AWS CloudFormation Puoi anche sintetizzare e distribuire ogni stack singolarmente utilizzando il comando. AWS CDK CLI cdk deploy

In questo esempio, trattiamo quanto segue:

  • Come estendere la Stack classe per accettare nuove proprietà o argomenti.

  • Come utilizzare le proprietà per determinare quali risorse contiene lo stack e la loro configurazione.

  • Come creare istanze di più stack da questa classe.

L'esempio in questo argomento utilizza una proprietà booleana denominata (encryptBucketPython:). encrypt_bucket Indica se un bucket Amazon S3 deve essere crittografato. In tal caso, lo stack abilita la crittografia utilizzando una chiave gestita da AWS Key Management Service ().AWS KMS L'app crea due istanze di questo stack, una con crittografia e una senza.

Prerequisiti

Questo esempio presuppone che tutte le fasi iniziali siano state completate.

Creare un progetto CDK

Per prima cosa, creiamo un CDK progetto usando 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

Puoi importare il progetto Maven risultante nel tuo Java. IDE

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

È possibile aprire il file src/Pipeline.sln in Visual Studio.

Aggiungere un parametro opzionale

L'propsargomento del Stack costruttore soddisfa l'interfaccia. StackProps In questo esempio, vogliamo che lo stack accetti una proprietà aggiuntiva che ci dica se crittografare il bucket Amazon S3. Per fare ciò, creiamo un'interfaccia o una classe che include la proprietà. Ciò consente al compilatore di assicurarsi che la proprietà abbia un valore booleano e di abilitarne il completamento automatico nel tuo. IDE

Apriamo il nostro file stack nel nostro editor IDE or e aggiungiamo la nuova interfaccia, classe o argomento. Le nuove righe sono evidenziate in grassetto:

TypeScript

File: 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

Archiviazione: lib/multistack-stack.js

JavaScript non ha una funzionalità di interfaccia; non è necessario aggiungere alcun codice.

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

File: multistack/multistack_stack.py

Python non ha una funzionalità di interfaccia, quindi estenderemo il nostro stack per accettare la nuova proprietà aggiungendo un argomento chiave.

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

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

Estendere un tipo di oggetti di scena in Java è più complicato di quanto vogliamo davvero approfondire. Invece, scrivi il costruttore dello stack per accettare un parametro booleano opzionale. Poiché props è un argomento facoltativo, scriveremo un costruttore aggiuntivo che ti permetta di saltarlo. L'impostazione predefinita sarà. 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#

File: 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 } } }

La nuova proprietà è facoltativa. Se encryptBucket (Python:encrypt_bucket) non è presente, il suo valore è undefined o l'equivalente locale. Per impostazione predefinita, il bucket non sarà crittografato.

Definisci la classe stack

Successivamente, definiamo la nostra classe stack, utilizzando la nostra nuova proprietà. Il nuovo codice è evidenziato in grassetto:

TypeScript

File: 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

Archiviazione: 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

Archiviazione: 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

Archiviazione: 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#

Archiviazione: 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 }); } } } }

Crea due istanze di stack

Nel nostro file dell'applicazione, aggiungiamo il codice per creare un'istanza di due stack separati. Eliminiamo la MultistackStack definizione esistente e definiamo i nostri due stack. Il nuovo codice è evidenziato in grassetto:

TypeScript

File: 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

Archiviazione: 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

Archiviazione: ./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

Archiviazione: 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#

File: 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(); } } }

Questo codice utilizza la nuova proprietà encryptBucket (Python:encrypt_bucket) sulla MultistackStack classe per istanziare quanto segue:

  • Uno stack con un bucket Amazon S3 crittografato nella regione. us-east-1 AWS

  • Uno stack con un bucket Amazon S3 non crittografato nella regione. us-west-1 AWS

Sintetizza e distribuisci lo stack

Successivamente, possiamo distribuire gli stack dall'app. Innanzitutto, sintetizziamo un modello per. AWS CloudFormation MyEastCdkStack Questo è lo stack incluso nel us-east-1 bucket crittografato Amazon S3.

$ cdk synth MyEastCdkStack

Per distribuire questo stack nel nostro AWS ambiente, possiamo emettere uno dei seguenti comandi. Il primo comando utilizza il nostro AWS profilo predefinito per ottenere le credenziali per distribuire lo stack. Il secondo utilizza un profilo specificato da noi. In PROFILE_NAME, possiamo sostituire il nome di un AWS CLI profilo che contiene le credenziali appropriate per la distribuzione su. us-east-1 Regione AWS

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

Eliminazione

Per evitare addebiti per le risorse che abbiamo distribuito, distruggiamo lo stack utilizzando il seguente comando:

cdk destroy MyEastCdkStack

L'operazione di distruzione fallisce se c'è qualcosa memorizzato nel bucket dello stack. Non dovrebbe esserci, dato che abbiamo creato solo il bucket. Se abbiamo messo qualcosa nel bucket, dobbiamo eliminare il contenuto del bucket prima di distruggere lo stack. Possiamo usare AWS Management Console o the per eliminare il contenuto del AWS CLI bucket.