여러 스택이 있는 앱 만들기 - AWS Cloud Development Kit (AWS CDK) v2

AWS CDK v2 개발자 안내서입니다. 구형 CDK v1은 2022년 6월 1일에 유지 보수에 들어갔고 2023년 6월 1일에 지원이 종료되었습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

여러 스택이 있는 앱 만들기

여러 스택이 포함된 AWS Cloud Development Kit (AWS CDK) 애플리케이션을 만들 수 있습니다. AWS CDK 앱을 배포하면 각 스택이 자체 AWS CloudFormation 템플릿이 됩니다. AWS CDK CLIcdk deploy명령을 사용하여 각 스택을 개별적으로 합성하고 배포할 수도 있습니다.

이 자습서에서는 다음 내용을 다룹니다.

  • 새 속성이나 인수를 허용하도록 Stack 클래스를 확장하는 방법

  • 속성을 사용하여 스택에 포함된 리소스와 해당 구성을 결정하는 방법

  • 이 클래스에서 여러 스택을 인스턴스화하는 방법

이 항목의 예제에서는 encryptBucket (Python:encrypt_bucket) 이라는 Boolean 속성을 사용합니다. Amazon S3 버킷을 암호화해야 하는지 여부를 나타냅니다. 그렇다면 스택은 AWS Key Management Service (AWS KMS) 에서 관리하는 키를 사용하여 암호화를 활성화합니다. 앱은 이 스택의 인스턴스 두 개를 생성합니다. 하나는 암호화가 적용되고 다른 하나는 암호화되지 않습니다.

시작하기 전 준비 사항

먼저 Node.js 및 AWS CDK 명령줄 도구를 설치하세요 (아직 설치하지 않았다면). 세부 정보는 시작하기 AWS CDK를 참조하세요.

그런 다음 명령줄에 다음 명령을 입력하여 AWS CDK 프로젝트를 생성합니다.

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

결과 Maven 프로젝트를 Java IDE로 가져올 수 있습니다.

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

Visual src/Pipeline.sln Studio에서 파일을 열 수 있습니다.

선택적 매개 변수 추가

Stack생성자의 props 인수가 인터페이스를 충족합니다. StackProps 이 예시에서는 Amazon S3 버킷을 암호화할지 여부를 알려주는 추가 속성을 스택에 허용하려고 합니다. 속성을 포함하는 인터페이스나 클래스를 만들어야 합니다. 이렇게 하면 컴파일러가 속성에 Boolean 값이 있는지 확인하고 IDE에서 해당 속성에 대한 자동 완성을 활성화할 수 있습니다.

따라서 표시된 소스 파일을 IDE 또는 편집기에서 열고 새 인터페이스, 클래스 또는 인수를 추가하십시오. 변경 후 코드는 다음과 같아야 합니다. 추가한 줄은 굵게 표시됩니다.

TypeScript

파일: 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 your stack goes here } }
JavaScript

파일: lib/multistack-stack.js

JavaScript 인터페이스 기능이 없으므로 코드를 추가할 필요가 없습니다.

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

파일: multistack/multistack_stack.py

Python에는 인터페이스 기능이 없으므로 키워드 인수를 추가하여 새 속성을 받아들이도록 스택을 확장합니다.

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 your stack goes here
Java

파일: src/main/java/com/myorg/MultistackStack.java

Java에서 props 유형을 확장하는 것은 생각보다 더 복잡합니다. 대신 선택적 Boolean 파라미터를 받아들이도록 스택의 생성자를 작성하세요. props는 선택적 인수이므로 건너뛸 수 있는 추가 생성자를 작성해 보겠습니다. 기본값은 입니다. 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 your stack goes here } }
C#

파일: 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 your stack goes here } } }

새 속성은 선택 사항입니다. encryptBucket(Python:encrypt_bucket) 가 없는 경우 해당 값은 또는 로컬에 해당하는 값입니다undefined. 버킷은 기본적으로 암호화되지 않습니다.

스택 클래스를 정의합니다.

이제 새 속성을 사용하여 스택 클래스를 정의해 보겠습니다. 코드를 다음과 같이 만들어 보세요. 추가 또는 변경해야 하는 코드는 굵게 표시됩니다.

TypeScript

파일: 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

파일: 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

파일: 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

파일: 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#

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

스택 인스턴스 2개 생성

이제 두 개의 개별 스택을 인스턴스화하는 코드를 추가해 보겠습니다. 이전과 마찬가지로 굵게 표시된 코드 줄을 추가해야 합니다. 기존 MultistackStack 정의를 삭제합니다.

TypeScript

파일: 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

파일: 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

파일: ./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

파일: 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#

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

이 코드는 MultistackStack 클래스의 new encryptBucket (Python:encrypt_bucket) 속성을 사용하여 다음을 인스턴스화합니다.

  • 리전에 암호화된 Amazon S3 버킷이 us-east-1 AWS 있는 스택 1개

  • 리전에 암호화되지 않은 Amazon S3 버킷이 us-west-1 AWS 있는 스택 1개

스택을 합성하고 배포합니다.

이제 앱에서 스택을 배포할 수 있습니다. 먼저 MyEastCdkStack —스택에 대한 AWS CloudFormation 템플릿을 합성합니다. us-east-1 암호화된 S3 버킷이 있는 스택입니다.

$ cdk synth MyEastCdkStack

이 스택을 AWS 계정에 배포하려면 다음 명령 중 하나를 실행합니다. 첫 번째 명령은 기본 AWS 프로필을 사용하여 스택을 배포하는 데 필요한 자격 증명을 얻습니다. 두 번째 방법은 지정한 프로필을 사용합니다. PROFILE_NAME의 경우 지역에 배포하기 위한 적절한 자격 증명이 포함된 AWS CLI 프로필 이름을 대체하십시오. us-east-1 AWS

cdk deploy MyEastCdkStack
cdk deploy MyEastCdkStack --profile=PROFILE_NAME

정리

배포한 리소스에 대한 요금이 청구되지 않도록 하려면 다음 명령을 사용하여 스택을 삭제하세요.

cdk destroy MyEastCdkStack

스택 버킷에 저장된 항목이 있는 경우 삭제 작업이 실패합니다. 이 주제의 지침만 따랐다면 그럴 수 없습니다. 하지만 버킷에 무언가를 넣었다면 스택을 파괴하기 전에 버킷 콘텐츠를 삭제해야 합니다. (버킷 자체는 삭제하지 마세요.) AWS Management Console 또는 를 AWS CLI 사용하여 버킷 콘텐츠를 삭제합니다.