v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔고 2023년 6월 1일에 지원을 종료했습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
와 함께 사용할 수 있는 여러 가지 방법으로 AWS 환경을 구성할 수 있습니다 AWS Cloud Development Kit (AWS CDK). 환경을 관리하는 AWS 가장 좋은 방법은 특정 요구 사항에 따라 달라집니다.
애플리케이션의 각 CDK 스택은 궁극적으로 환경과 연결되어 스택이 배포되는 위치를 결정해야 합니다.
AWS 환경에 대한 소개는 섹션을 참조하세요를 위한 환경 AWS CDK.
보안 인증 및 구성 파일에서 환경을 지정하거나 AWS 구성 라이브러리에서 Stack
구성의 env
속성을 사용하여 환경을 지정할 수 있습니다.
AWS Command Line Interface (AWS CLI)를 사용하여 AWS 환경 정보를 저장, 구성 및 관리하는 credentials
및 config
파일을 생성할 수 있습니다. 이러한 파일에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서의 구성 및 보안 인증 파일 설정을 참조하세요.
이러한 파일에 저장된 값은 프로필 로 구성됩니다. 프로필의 이름과 이러한 파일의 키-값 페어의 이름은 프로그래밍 방식 액세스를 구성하는 방법에 따라 달라집니다. 다양한 메서드에 대한 자세한 내용은 섹션을 참조하세요에 대한 보안 자격 증명을 구성합니다. AWS CDKCLI.
일반적으로 는 credentials
파일의 AWS 계정 정보와 config
파일의 AWS 리전 정보를 AWS CDK 확인합니다.
credentials
및 config
파일을 구성한 후 에 사용할 환경을 지정할 수 있습니다. AWS CDK CLI 환경 변수를 통해
Stack
구성 요소의 env
속성을 사용하여 각 스택의 환경을 지정할 수 있습니다. 이 속성은 사용할 계정과 리전을 정의합니다. 하드 코딩된 값을 이 속성에 전달하거나 에서 제공하는 환경 변수를 전달할 수 있습니다CDK.
환경 변수를 전달하려면 AWS_DEFAULT_ACCOUNT
및 AWS_DEFAULT_REGION
환경 변수를 사용합니다. 이러한 환경 변수는 credentials
및 config
파일의 값을 전달할 수 있습니다. CDK 코드 내에서 로직을 사용하여 이러한 환경 변수의 값을 확인할 수도 있습니다.
환경을 지정하는 여러 방법을 사용하는 경우 는 다음 우선 순위를 AWS CDK 준수합니다.
-
Stack
구성 요소의 env
속성으로 지정된 하드 코딩된 값입니다.
-
AWS_DEFAULT_ACCOUNT
및 AWS_DEFAULT_REGION
환경 변수는 Stack
구성 요소의 env
속성으로 지정됩니다.
-
credentials
및 config
파일의 프로파일과 연결되어 로 전달되는 환경 정보 CDK CLI --profile
옵션을 사용합니다.
-
credentials
및 config
파일의 default
프로파일입니다.
를 사용하여 개발할 때는 먼저 AWS 리소스를 나타내는 구성 요소가 포함된 CDK 스택을 CDK정의해야 합니다. 다음으로 각 CDK 스택을 AWS CloudFormation 템플릿으로 합성합니다. 그런 다음 CloudFormation 템플릿을 환경에 배포합니다. 환경을 지정하는 방법은 환경 정보가 적용되는 시기를 결정하고 CDK 동작 및 결과에 영향을 미칠 수 있습니다.
Stack
구성 요소의 env
속성을 사용하여 환경 정보를 지정하면 템플릿 합성 시 환경 정보가 적용됩니다. 환경별 CloudFormation 템플릿을 실행cdk synth
하거나 cdk deploy
생성합니다.
env
속성 내에서 환경 변수를 사용하는 경우 --profile
옵션을 와 함께 사용해야 합니다. CDK CLI 자격 증명 및 구성 파일의 환경 정보가 포함된 프로필에 전달할 명령입니다. 그런 다음 템플릿 합성 시 이 정보가 적용되어 환경별 템플릿을 생성합니다.
CloudFormation 템플릿 내의 환경 정보가 다른 방법보다 우선합니다. 예를 들어 에 다른 환경을 제공하는 경우 cdk deploy --profile profile
프로필은 무시됩니다.
이러한 방식으로 환경 정보를 제공하는 경우 CDK 앱 내에서 환경 종속 코드 및 로직을 사용할 수 있습니다. 즉, 합성된 템플릿은 합성된 기계, 사용자 또는 세션에 따라 다를 수 있습니다. 이 접근 방식은 개발 중에 허용되거나 바람직한 경우가 많지만 프로덕션 용도로는 권장되지 않습니다.
Stack
구성의 env
속성을 사용하여 환경을 지정하지 않으면 CDK CLI 는 합성 시 환경 제약 CloudFormation 템플릿을 생성합니다. 그런 다음 를 사용하여 배포할 환경을 지정할 수 있습니다cdk deploy --profile profile
.
환경에 구애받지 않는 템플릿을 배포할 때 프로필을 지정하지 않으면 CDK CLI 는 배포 시 credentials
및 config
파일의 default
프로파일에서 환경 값을 사용하려고 시도합니다.
배포 시 환경 정보를 사용할 수 없는 경우 는 , stack.account
stack.region
및 와 같은 환경 관련 속성을 통해 배포 시 환경 정보를 확인하려고 시도 AWS CloudFormation 합니다stack.availabilityZones
.
환경에 구애받지 않는 스택의 경우 스택 내의 구성은 환경 정보를 사용할 수 없으며 환경 정보가 필요한 로직을 사용할 수 없습니다. 예를 들어 와 같은 코드를 작성if (stack.region ==== 'us-east-1')
하거나 와 같은 환경 정보가 필요한 구성 방법을 사용할 수 없습니다Vpc.fromLookup
. 이러한 기능을 사용하려면 env
속성이 있는 환경을 지정해야 합니다.
환경 제약 스택의 경우 가용 영역을 사용하는 모든 구성에는 가용 영역이 두 개 표시되므로 스택을 모든 리전에 배포할 수 있습니다.
Stack
구성의 env
속성을 사용하여 스택의 AWS 환경 값을 지정합니다. 다음은 그 예제입니다.
- TypeScript
-
const envEU = { account: '2383838383', region: 'eu-west-1' };
const envUSA = { account: '8373873873', region: 'us-west-2' };
new MyFirstStack(app, 'first-stack-us', { env: envUSA });
new MyFirstStack(app, 'first-stack-eu', { env: envEU });
- JavaScript
-
const envEU = { account: '2383838383', region: 'eu-west-1' };
const envUSA = { account: '8373873873', region: 'us-west-2' };
new MyFirstStack(app, 'first-stack-us', { env: envUSA });
new MyFirstStack(app, 'first-stack-eu', { env: envEU });
- Python
-
env_EU = cdk.Environment(account="8373873873", region="eu-west-1")
env_USA = cdk.Environment(account="2383838383", region="us-west-2")
MyFirstStack(app, "first-stack-us", env=env_USA)
MyFirstStack(app, "first-stack-eu", env=env_EU)
- Java
-
public class MyApp {
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
return Environment.builder()
.account(account)
.region(region)
.build();
}
public static void main(final String argv[]) {
App app = new App();
Environment envEU = makeEnv("8373873873", "eu-west-1");
Environment envUSA = makeEnv("2383838383", "us-west-2");
new MyFirstStack(app, "first-stack-us", StackProps.builder()
.env(envUSA).build());
new MyFirstStack(app, "first-stack-eu", StackProps.builder()
.env(envEU).build());
app.synth();
}
}
- C#
-
Amazon.CDK.Environment makeEnv(string account, string region)
{
return new Amazon.CDK.Environment
{
Account = account,
Region = region
};
}
var envEU = makeEnv(account: "8373873873", region: "eu-west-1");
var envUSA = makeEnv(account: "2383838383", region: "us-west-2");
new MyFirstStack(app, "first-stack-us", new StackProps { Env=envUSA });
new MyFirstStack(app, "first-stack-eu", new StackProps { Env=envEU });
- Go
-
env_EU := awscdk.Environment{
Account: jsii.String("8373873873"),
Region: jsii.String("eu-west-1"),
}
env_USA := awscdk.Environment{
Account: jsii.String("2383838383"),
Region: jsii.String("us-west-2"),
}
MyFirstStack(app, "first-stack-us", &awscdk.StackProps{
Env: &env_USA,
})
MyFirstStack(app, "first-stack-eu", &awscdk.StackProps{
Env: &env_EU,
})
프로덕션 환경에는 이 접근 방식을 사용하는 것이 좋습니다. 이러한 방식으로 환경을 명시적으로 지정하면 스택이 항상 특정 환경에 배포되도록 할 수 있습니다.
는 CDK 코드 내에서 사용할 수 있는 두 가지 환경 변수인 CDK_DEFAULT_ACCOUNT
및 를 AWS CDK 제공합니다CDK_DEFAULT_REGION
. 스택 인스턴스의 env
속성 내에서 이러한 환경 변수를 사용하는 경우 를 사용하여 보안 인증 및 구성 파일에서 환경 정보를 전달할 수 있습니다. CDK CLI --profile
옵션.
다음은 이러한 환경 변수를 지정하는 방법의 예입니다.
- TypeScript
-
노드의 process
객체를 통해 환경 변수에 액세스합니다.
process
에서 사용할 DefinitelyTyped
모듈이 필요합니다 TypeScript. 는 이 모듈을 cdk init
설치합니다. 그러나 이 모듈을 추가하기 전에 생성된 프로젝트를 작업하거나 를 사용하여 프로젝트를 설정하지 않은 경우 이 모듈을 수동으로 설치해야 합니다cdk init
.
npm install @types/node
new MyDevStack(app, 'dev', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
}});
- JavaScript
-
노드의 process
객체를 통해 환경 변수에 액세스합니다.
new MyDevStack(app, 'dev', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
}});
- Python
-
os
모듈의 environ
사전을 사용하여 환경 변수에 액세스합니다.
import os
MyDevStack(app, "dev", env=cdk.Environment(
account=os.environ["CDK_DEFAULT_ACCOUNT"],
region=os.environ["CDK_DEFAULT_REGION"]))
- Java
-
System.getenv()
를 사용하여 환경 변수의 값을 가져옵니다.
public class MyApp {
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account;
region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region;
return Environment.builder()
.account(account)
.region(region)
.build();
}
public static void main(final String argv[]) {
App app = new App();
Environment envEU = makeEnv(null, null);
Environment envUSA = makeEnv(null, null);
new MyDevStack(app, "first-stack-us", StackProps.builder()
.env(envUSA).build());
new MyDevStack(app, "first-stack-eu", StackProps.builder()
.env(envEU).build());
app.synth();
}
}
- C#
-
System.Environment.GetEnvironmentVariable()
를 사용하여 환경 변수의 값을 가져옵니다.
Amazon.CDK.Environment makeEnv(string account=null, string region=null)
{
return new Amazon.CDK.Environment
{
Account = account ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"),
Region = region ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION")
};
}
new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });
- Go
-
import "os"
MyDevStack(app, "dev", &awscdk.StackProps{
Env: &awscdk.Environment{
Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),
Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")),
},
})
환경 변수를 사용하여 환경을 지정하면 서로 다른 환경의 AWS CloudFormation 템플릿과 동일한 CDK 스택 합성을 수행할 수 있습니다. 즉, CDK 코드를 수정할 필요 없이 동일한 CDK 스택을 다른 AWS 환경에 배포할 수 있습니다. 를 실행할 때 사용할 프로파일만 지정하면 됩니다cdk synth
.
이 접근 방식은 동일한 스택을 다른 환경에 배포할 때 개발 환경에 적합합니다. 그러나 프로덕션 환경에는 이 접근 방식을 권장하지 않습니다. 동일한 CDK 코드가 합성되는 기계, 사용자 또는 세션에 따라 다른 템플릿을 합성할 수 있기 때문입니다.
환경에 구애받지 않는 템플릿을 배포할 때는 --profile
옵션을 CDK CLI 명령을 사용하여 사용할 프로파일을 지정합니다. 다음은 credentials
및 config
파일에 정의된 prod
프로파일을 myStack
사용하여 라는 CDK 스택을 배포하는 예제입니다.
$
cdk deploy myStack
--profile prod
--profile
옵션에 대한 자세한 내용과 기타 CDK CLI 명령 및 옵션은 섹션을 참조하세요AWS CDK CLI 명령 참조.
스택 내에서 구성 요소를 사용하여 정의하는 서비스는 배포하려는 리전을 지원해야 합니다. 리전 AWS 서비스 별로 지원되는 목록은 AWS 리전별 서비스를 참조하세요.
AWS CDK 를 사용하여 지정된 환경에 스택 배포를 수행하려면 유효한 AWS Identity and Access Management (IAM) 보안 인증 정보가 있어야 합니다.
이 예제에서는 CDK 스택에서 환경 제약 CloudFormation 템플릿을 생성합니다. 그런 다음 이 템플릿을 모든 환경에 배포할 수 있습니다.
다음은 예제 CDK 스택입니다. 이 스택은 Amazon S3 버킷과 버킷의 리전에 대한 CloudFormation 스택 출력을 정의합니다. 이 예제에서는 env
가 정의되지 않았습니다.
- TypeScript
-
export class CdkAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Create the S3 bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
// Create an output for the bucket's Region
new cdk.CfnOutput(this, 'BucketRegion', {
value: bucket.env.region,
});
}
}
- JavaScript
-
class CdkAppStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
// Create the S3 bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
// Create an output for the bucket's Region
new cdk.CfnOutput(this, 'BucketRegion', {
value: bucket.env.region,
});
}
}
- Python
-
class CdkAppStack(cdk.Stack):
def __init__(self, scope: cdk.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# Create the S3 bucket
bucket = s3.Bucket(self, 'amzn-s3-demo-bucket',
removal_policy=cdk.RemovalPolicy.DESTROY
)
# Create an output for the bucket's Region
cdk.CfnOutput(self, 'BucketRegion',
value=bucket.env.region
)
- Java
-
public class CdkAppStack extends Stack {
public CdkAppStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
// Create the S3 bucket
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket")
.removalPolicy(RemovalPolicy.DESTROY)
.build();
// Create an output for the bucket's Region
CfnOutput.Builder.create(this, "BucketRegion")
.value(this.getRegion())
.build();
}
}
- C#
-
namespace MyCdkApp
{
public class CdkAppStack : Stack
{
public CdkAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
{
// Create the S3 bucket
var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps
{
RemovalPolicy = RemovalPolicy.DESTROY
});
// Create an output for the bucket's Region
new CfnOutput(this, "BucketRegion", new CfnOutputProps
{
Value = this.Region
});
}
}
}
- Go
-
func NewCdkAppStack(scope constructs.Construct, id string, props *CdkAppStackProps) awscdk.Stack {
stack := awscdk.NewStack(scope, &id, &props.StackProps)
// Create the S3 bucket
bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
RemovalPolicy: awscdk.RemovalPolicy_DESTROY,
})
// Create an output for the bucket's Region
awscdk.NewCfnOutput(stack, jsii.String("BucketRegion"), &awscdk.CfnOutputProps{
Value: stack.Region(),
})
return stack
}
cdk synth
를 실행하면 CDK CLI 는 가상 파라미터를 버킷 리전의 AWS::Region
출력 값으로 사용하여 CloudFormation 템플릿을 생성합니다. 이 파라미터는 배포 시 확인됩니다.
Outputs:
BucketRegion:
Value:
Ref: AWS::Region
이 스택을 보안 인증 및 구성 파일의 dev
프로필에 지정된 환경에 배포하기 위해 다음을 실행합니다.
$
cdk deploy CdkAppStack --profile dev
프로파일을 지정하지 않으면 CDK CLI 는 보안 인증 및 구성 파일의 default
프로필에서 환경 정보를 사용하려고 시도합니다.
이 예제에서는 유효한 표현식을 사용하도록 stack
인스턴스의 env
속성을 구성합니다. 두 개의 추가 환경 변수인 CDK_DEPLOY_ACCOUNT
및 를 지정합니다CDK_DEPLOY_REGION
. 이러한 환경 변수가 있는 경우 합성 시 기본값을 재정의할 수 있습니다.
- TypeScript
-
new MyDevStack(app, 'dev', {
env: {
account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION
}});
- JavaScript
-
new MyDevStack(app, 'dev', {
env: {
account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION
}});
- Python
-
MyDevStack(app, "dev", env=cdk.Environment(
account=os.environ.get("CDK_DEPLOY_ACCOUNT", os.environ["CDK_DEFAULT_ACCOUNT"]),
region=os.environ.get("CDK_DEPLOY_REGION", os.environ["CDK_DEFAULT_REGION"])
- Java
-
public class MyApp {
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
account = (account == null) ? System.getenv("CDK_DEPLOY_ACCOUNT") : account;
region = (region == null) ? System.getenv("CDK_DEPLOY_REGION") : region;
account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account;
region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region;
return Environment.builder()
.account(account)
.region(region)
.build();
}
public static void main(final String argv[]) {
App app = new App();
Environment envEU = makeEnv(null, null);
Environment envUSA = makeEnv(null, null);
new MyDevStack(app, "first-stack-us", StackProps.builder()
.env(envUSA).build());
new MyDevStack(app, "first-stack-eu", StackProps.builder()
.env(envEU).build());
app.synth();
}
}
- C#
-
Amazon.CDK.Environment makeEnv(string account=null, string region=null)
{
return new Amazon.CDK.Environment
{
Account = account ??
System.Environment.GetEnvironmentVariable("CDK_DEPLOY_ACCOUNT") ??
System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"),
Region = region ??
System.Environment.GetEnvironmentVariable("CDK_DEPLOY_REGION") ??
System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION")
};
}
new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });
- Go
-
var account, region string
var b bool
if account, b = os.LookupEnv("CDK_DEPLOY_ACCOUNT"); !b || len(account) == 0 {
account = os.Getenv("CDK_DEFAULT_ACCOUNT")
}
if region, b = os.LookupEnv("CDK_DEPLOY_REGION"); !b || len(region) == 0 {
region = os.Getenv("CDK_DEFAULT_REGION")
}
MyDevStack(app, "dev", &awscdk.StackProps{
Env: &awscdk.Environment{
Account: &account,
Region: ®ion,
},
})
스택의 환경을 이렇게 선언하면 짧은 스크립트 또는 배치 파일을 작성하고 명령줄 인수에서 변수를 설정한 다음 를 호출할 수 있습니다cdk deploy
. 다음은 예입니다. 처음 두 개를 초과하는 모든 인수는 로 전달cdk deploy
되어 명령줄 옵션 또는 인수를 지정합니다.
- macOS/Linux
-
#!/usr/bin/env bash
if [[ $# -ge 2 ]]; then
export CDK_DEPLOY_ACCOUNT=$1
export CDK_DEPLOY_REGION=$2
shift; shift
npx cdk deploy "$@"
exit $?
else
echo 1>&2 "Provide account and region as first two args."
echo 1>&2 "Additional args are passed through to cdk deploy."
exit 1
fi
스크립트를 로 저장cdk-deploy-to.sh
한 다음 를 실행chmod +x cdk-deploy-to.sh
하여 실행 가능하게 만듭니다.
- Windows
-
@findstr /B /V @ %~dpnx0 > %~dpn0.ps1 && powershell -ExecutionPolicy Bypass %~dpn0.ps1 %*
@exit /B %ERRORLEVEL%
if ($args.length -ge 2) {
$env:CDK_DEPLOY_ACCOUNT, $args = $args
$env:CDK_DEPLOY_REGION, $args = $args
npx cdk deploy $args
exit $lastExitCode
} else {
[console]::error.writeline("Provide account and region as first two args.")
[console]::error.writeline("Additional args are passed through to cdk deploy.")
exit 1
}
스크립트의 Windows 버전은 PowerShell 를 사용하여 macOS/Linux 버전과 동일한 기능을 제공합니다. 또한 명령줄에서 쉽게 호출할 수 있도록 배치 파일로 실행되도록 허용하는 지침도 포함되어 있습니다. 로 저장해야 합니다cdk-deploy-to.bat
. 배치 파일이 호출cdk-deploy-to.ps1
될 때 파일이 생성됩니다.
그런 다음 스크립트를 사용하여 특정 환경에 배포하는 추가 cdk-deploy-to
스크립트를 작성할 수 있습니다. 다음은 그 예제입니다.
- macOS/Linux
-
#!/usr/bin/env bash
# cdk-deploy-to-test.sh
./cdk-deploy-to.sh 123457689 us-east-1 "$@"
- Windows
-
@echo off
rem cdk-deploy-to-test.bat
cdk-deploy-to 135792469 us-east-1 %*
다음은 cdk-deploy-to
스크립트를 사용하여 여러 환경에 배포하는 예제입니다. 첫 번째 배포가 실패하면 프로세스가 중지됩니다.
- macOS/Linux
-
#!/usr/bin/env bash
# cdk-deploy-to-prod.sh
./cdk-deploy-to.sh 135792468 us-west-1 "$@" || exit
./cdk-deploy-to.sh 246813579 eu-west-1 "$@"
- Windows
-
@echo off
rem cdk-deploy-to-prod.bat
cdk-deploy-to 135792469 us-west-1 %* || exit /B
cdk-deploy-to 245813579 eu-west-1 %*