와 함께 사용할 환경 구성 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔고 2023년 6월 1일에 지원을 종료했습니다.

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

와 함께 사용할 환경 구성 AWS CDK

와 함께 사용할 수 있는 여러 가지 방법으로 AWS 환경을 구성할 수 있습니다 AWS Cloud Development Kit (AWS CDK). 환경을 관리하는 AWS 가장 좋은 방법은 특정 요구 사항에 따라 달라집니다.

애플리케이션의 각 CDK 스택은 궁극적으로 환경과 연결되어 스택이 배포되는 위치를 결정해야 합니다.

AWS 환경에 대한 소개는 섹션을 참조하세요를 위한 환경 AWS CDK.

에서 환경을 지정할 수 있는 위치

보안 인증 및 구성 파일에서 환경을 지정하거나 AWS 구성 라이브러리에서 Stack 구성의 env 속성을 사용하여 환경을 지정할 수 있습니다.

자격 증명 및 구성 파일

AWS Command Line Interface (AWS CLI)를 사용하여 AWS 환경 정보를 저장, 구성 및 관리하는 credentialsconfig 파일을 생성할 수 있습니다. 이러한 파일에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서구성 및 보안 인증 파일 설정을 참조하세요.

이러한 파일에 저장된 값은 프로필 로 구성됩니다. 프로필의 이름과 이러한 파일의 키-값 페어의 이름은 프로그래밍 방식 액세스를 구성하는 방법에 따라 달라집니다. 다양한 메서드에 대한 자세한 내용은 섹션을 참조하세요에 대한 보안 자격 증명을 구성합니다. AWS CDKCLI.

일반적으로 는 credentials 파일의 AWS 계정 정보와 config 파일의 AWS 리전 정보를 AWS CDK 확인합니다.

credentialsconfig 파일을 구성한 후 에 사용할 환경을 지정할 수 있습니다. AWS CDK CLI 환경 변수를 통해

스택 구성의 env 속성

Stack 구성 요소의 env 속성을 사용하여 각 스택의 환경을 지정할 수 있습니다. 이 속성은 사용할 계정과 리전을 정의합니다. 하드 코딩된 값을 이 속성에 전달하거나 에서 제공하는 환경 변수를 전달할 수 있습니다CDK.

환경 변수를 전달하려면 AWS_DEFAULT_ACCOUNTAWS_DEFAULT_REGION 환경 변수를 사용합니다. 이러한 환경 변수는 credentialsconfig 파일의 값을 전달할 수 있습니다. CDK 코드 내에서 로직을 사용하여 이러한 환경 변수의 값을 확인할 수도 있습니다.

환경 우선 순위 AWS CDK

환경을 지정하는 여러 방법을 사용하는 경우 는 다음 우선 순위를 AWS CDK 준수합니다.

  1. Stack 구성 요소의 env 속성으로 지정된 하드 코딩된 값입니다.

  2. AWS_DEFAULT_ACCOUNTAWS_DEFAULT_REGION 환경 변수는 Stack 구성 요소의 env 속성으로 지정됩니다.

  3. credentialsconfig 파일의 프로파일과 연결되어 로 전달되는 환경 정보 CDK CLI --profile 옵션을 사용합니다.

  4. credentialsconfig 파일의 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 는 배포 시 credentialsconfig 파일의 default 프로파일에서 환경 값을 사용하려고 시도합니다.

배포 시 환경 정보를 사용할 수 없는 경우 는 , stack.account stack.region및 와 같은 환경 관련 속성을 통해 배포 시 환경 정보를 확인하려고 시도 AWS CloudFormation 합니다stack.availabilityZones.

환경에 구애받지 않는 스택의 경우 스택 내의 구성은 환경 정보를 사용할 수 없으며 환경 정보가 필요한 로직을 사용할 수 없습니다. 예를 들어 와 같은 코드를 작성if (stack.region ==== 'us-east-1')하거나 와 같은 환경 정보가 필요한 구성 방법을 사용할 수 없습니다Vpc.fromLookup. 이러한 기능을 사용하려면 env 속성이 있는 환경을 지정해야 합니다.

환경 제약 스택의 경우 가용 영역을 사용하는 모든 구성에는 가용 영역이 두 개 표시되므로 스택을 모든 리전에 배포할 수 있습니다.

를 사용하여 환경을 지정하는 방법 AWS CDK

각 스택에 하드 코딩된 환경 지정

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 코드가 합성되는 기계, 사용자 또는 세션에 따라 다른 템플릿을 합성할 수 있기 때문입니다.

를 사용하여 자격 증명 및 구성 파일에서 환경 지정 CDK CLI

환경에 구애받지 않는 템플릿을 배포할 때는 --profile 옵션을 CDK CLI 명령을 사용하여 사용할 프로파일을 지정합니다. 다음은 credentialsconfig 파일에 정의된 prod 프로파일을 myStack 사용하여 라는 CDK 스택을 배포하는 예제입니다.

$ cdk deploy myStack --profile prod

--profile 옵션에 대한 자세한 내용과 기타 CDK CLI 명령 및 옵션은 섹션을 참조하세요AWS CDK CLI   명령 참조.

를 사용하여 환경을 구성할 때 고려 사항 AWS CDK

스택 내에서 구성 요소를 사용하여 정의하는 서비스는 배포하려는 리전을 지원해야 합니다. 리전 AWS 서비스 별로 지원되는 목록은 AWS 리전별 서비스를 참조하세요.

AWS CDK 를 사용하여 지정된 환경에 스택 배포를 수행하려면 유효한 AWS Identity and Access Management (IAM) 보안 인증 정보가 있어야 합니다.

예시

CDK 스택에서 환경 독립적 CloudFormation 템플릿 동기화

이 예제에서는 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: &region, }, })

스택의 환경을 이렇게 선언하면 짧은 스크립트 또는 배치 파일을 작성하고 명령줄 인수에서 변수를 설정한 다음 를 호출할 수 있습니다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 %*