Contoh: Membuat CDK aplikasi dengan beberapa tumpukan - AWS Cloud Development Kit (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Contoh: Membuat CDK aplikasi dengan beberapa tumpukan

Anda dapat membuat AWS Cloud Development Kit (AWS CDK) aplikasi yang berisi beberapa tumpukan. Saat Anda menerapkan AWS CDK aplikasi, setiap tumpukan menjadi AWS CloudFormation templatnya sendiri. Anda juga dapat mensintesis dan menyebarkan setiap tumpukan satu per satu menggunakan perintah. AWS CDK CLI cdk deploy

Dalam contoh ini, kami membahas yang berikut:

  • Cara memperluas Stack kelas untuk menerima properti atau argumen baru.

  • Cara menggunakan properti untuk menentukan sumber daya mana yang berisi tumpukan dan konfigurasinya.

  • Cara membuat instance beberapa tumpukan dari kelas ini.

Contoh dalam topik ini menggunakan properti Boolean, bernama encryptBucket (Pythonencrypt_bucket:). Ini menunjukkan apakah bucket Amazon S3 harus dienkripsi. Jika demikian, tumpukan memungkinkan enkripsi menggunakan kunci yang dikelola oleh AWS Key Management Service (AWS KMS). Aplikasi ini membuat dua instance tumpukan ini, satu dengan enkripsi dan satu tanpa.

Prasyarat

Contoh ini mengasumsikan bahwa semua langkah memulai telah selesai.

Buat CDK proyek

Pertama, kami membuat CDK proyek menggunakan 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

Anda dapat mengimpor proyek Maven yang dihasilkan ke Java Anda. IDE

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

Anda dapat membuka file src/Pipeline.sln di Visual Studio.

Tambahkan parameter opsional

propsArgumen Stack konstruktor memenuhi antarmuka. StackProps Dalam contoh ini, kami ingin tumpukan menerima properti tambahan untuk memberi tahu kami apakah akan mengenkripsi bucket Amazon S3. Untuk melakukan ini, kita membuat antarmuka atau kelas yang mencakup properti. Hal ini memungkinkan compiler untuk memastikan bahwa properti memiliki nilai Boolean dan memungkinkan pelengkapan otomatis untuk itu di Anda. IDE

Kami membuka file stack kami di IDE atau editor kami dan menambahkan antarmuka, kelas, atau argumen baru. Baris baru disorot dengan huruf tebal:

TypeScript

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

Berkas: lib/multistack-stack.js

JavaScript tidak memiliki fitur antarmuka; kita tidak perlu menambahkan kode apa pun.

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

Berkas: multistack/multistack_stack.py

Python tidak memiliki fitur antarmuka, jadi kami akan memperluas tumpukan kami untuk menerima properti baru dengan menambahkan argumen kata kunci.

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

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

Ini lebih rumit daripada yang benar-benar ingin kita masuki untuk memperluas jenis alat peraga di Java. Sebagai gantinya, tulis konstruktor tumpukan untuk menerima parameter Boolean opsional. Karena props merupakan argumen opsional, kami akan menulis konstruktor tambahan yang memungkinkan Anda melewatinya. Ini akan default kefalse.

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#

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

Properti baru adalah opsional. Jika encryptBucket (Python:encrypt_bucket) tidak ada, nilainya adalahundefined, atau setara lokal. Bucket tidak akan dienkripsi secara default.

Tentukan kelas tumpukan

Selanjutnya, kita mendefinisikan kelas stack kita, menggunakan properti baru kita. Kode baru disorot dengan huruf tebal:

TypeScript

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

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

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

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

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

Buat dua instance tumpukan

Dalam file aplikasi kami, kami menambahkan kode untuk membuat instance dua tumpukan terpisah. Kami menghapus MultistackStack definisi yang ada dan mendefinisikan dua tumpukan kami. Kode baru disorot dengan huruf tebal:

TypeScript

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

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

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

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

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

Kode ini menggunakan properti baru encryptBucket (Python:encrypt_bucket) di MultistackStack kelas untuk membuat contoh berikut:

  • Satu tumpukan dengan bucket Amazon S3 terenkripsi di Wilayah. us-east-1 AWS

  • Satu tumpukan dengan bucket Amazon S3 yang tidak terenkripsi di Wilayah. us-west-1 AWS

Sintesis dan gunakan tumpukan

Selanjutnya, kita dapat menerapkan tumpukan dari aplikasi. Pertama, kami mensintesis AWS CloudFormation template untukMyEastCdkStack. Ini adalah tumpukan us-east-1 dengan ember Amazon S3 terenkripsi.

$ cdk synth MyEastCdkStack

Untuk menyebarkan tumpukan ini ke AWS lingkungan kita, kita dapat mengeluarkan salah satu perintah berikut. Perintah pertama menggunakan AWS profil default kami untuk mendapatkan kredensyal untuk menyebarkan tumpukan. Yang kedua menggunakan profil yang kami tentukan. Untuk PROFILE_NAME, kita dapat mengganti nama AWS CLI profil yang berisi kredensi yang sesuai untuk diterapkan ke. us-east-1 Wilayah AWS

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

Bersihkan

Untuk menghindari biaya untuk sumber daya yang kami terapkan, kami menghancurkan tumpukan menggunakan perintah berikut:

cdk destroy MyEastCdkStack

Operasi penghancuran gagal jika ada sesuatu yang disimpan dalam ember tumpukan. Seharusnya tidak ada, karena kita hanya membuat ember. Jika kita memasukkan sesuatu ke dalam ember, kita harus menghapus isi bucket sebelum menghancurkan tumpukan. Kita dapat menggunakan AWS Management Console atau AWS CLI untuk menghapus isi bucket.