v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
예: 여러 스택이 있는 CDK 앱 생성
여러 스택이 포함된 AWS Cloud Development Kit (AWS CDK) 애플리케이션을 생성할 수 있습니다. AWS CDK 스택 소개 AWS CDK 앱을 배포하면 각 스택이 자체 AWS CloudFormation 템플릿이 됩니다. cdk deploy
명령을 사용하여 각 스택을 AWS CDK CLI 개별적으로 합성하고 배포할 수도 있습니다.
이 예에서는 다음과 같은 내용을 다룹니다.
-
Stack
클래스를 확장하여 새 속성 또는 인수를 수락하는 방법
-
속성을 사용하여 스택에 포함된 리소스와 그 구성을 확인하는 방법
-
이 클래스에서 여러 스택을 인스턴스화하는 방법
이 주제의 예에서는 encryptBucket
(Python: encrypt_bucket
)이라는 부울 속성을 사용합니다. 이는 Amazon S3 버킷을 암호화해야 하는지 여부를 나타냅니다. 이 경우 스택은 AWS Key Management Service ()에서 관리하는 키를 사용하여 암호화를 활성화합니다AWS KMS. 앱은 이 스택의 인스턴스를 2개 생성하는데, 하나는 암호화가 적용된 인스턴스이고 다른 하나는 암호화가 적용되지 않은 인스턴스입니다.
사전 조건
이 예에서는 시작하기 단계가 모두 완료되었다고 가정합니다.
CDK 프로젝트 만들기
먼저 CDK CLI를 사용하여 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 Studio에서 src/Pipeline.sln
파일을 열 수 있습니다.
선택 사항 파라미터 추가
Stack
생성자의 props
인수는 StackProps
인터페이스를 구현합니다. 이 예에서는 스택이 Amazon S3 버킷을 암호화할지 여부를 알려주는 추가 속성을 수락하기를 원합니다. 이를 위해 속성을 포함하는 인터페이스 또는 클래스를 생성합니다. 이를 통해 컴파일러는 속성에 부울 값이 있는지 확인하고 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 our 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 our 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 our stack goes here
- Java
-
파일: src/main/java/com/myorg/MultistackStack.java
Java에서 props 유형을 확장하는 것은 우리가 실제로 다루려는 것보다 더 복잡합니다. 대신 선택적 부울 파라미터를 수락하도록 스택의 생성자를 작성합니다. 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 our 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 our 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개의 스택 인스턴스 생성
애플리케이션 파일에서 코드를 추가하여 2개의 개별 스택을 인스턴스화합니다. 기존 MultistackStack
정의를 삭제하고 2개의 스택을 정의합니다. 새 코드는 굵게 강조 표시됩니다.
- 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
클래스의 새 encryptBucket
(Python: encrypt_bucket
) 속성을 사용하여 다음을 인스턴스화합니다.
스택 동기화 및 배포
다음으로 앱에서 스택을 배포할 수 있습니다. 먼저 용 AWS CloudFormation 템플릿을 합성합니다MyEastCdkStack
. 이는 암호화된 Amazon S3 버킷이 있는 us-east-1
의 스택입니다.
$
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 삭제할 수 있습니다.