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

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

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

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

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

애플리케이션의 각 CDK 스택은 결국 환경에 연결되어야 스택이 배포되는 위치를 결정할 수 있습니다.

AWS 환경에 대한 소개는 를 참조하십시오환경.

어디에서 환경을 지정할 수 있습니까?

자격 증명 및 구성 파일에서 또는 구성 라이브러리의 AWS 구성 env 속성을 사용하여 환경을 지정할 수 있습니다. Stack

자격 증명 및 구성 파일

AWS Command Line Interface (AWS CLI) 를 사용하여 AWS 환경 정보를 저장, 구성 및 관리하는 config 파일을 만들 credentials 수 있습니다. 이러한 파일에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서의 구성 및 자격 증명 파일 설정을 참조하십시오.

이러한 파일에 저장된 값은 프로필별로 정리됩니다. 프로파일의 이름을 지정하는 방법과 이러한 파일의 키-값 쌍은 프로그래밍 방식 액세스를 구성하는 방법에 따라 달라집니다. 다양한 방법에 대한 자세한 내용은 을 참조하십시오. 에 대한 보안 자격 증명을 구성합니다. AWS CDKCLI

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

credentialsconfig 파일을 구성한 후에는 환경 변수와 함께 사용할 환경을 지정할 수 있습니다. AWS CDK CLI

Stack 구문의 env 속성

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

환경 변수를 전달하려면 및 환경 변수를 사용하십시오. AWS_DEFAULT_ACCOUNT AWS_DEFAULT_REGION 이러한 환경 변수는 사용자 credentialsconfig 파일의 값을 전달할 수 있습니다. CDK 코드 내에서 로직을 사용하여 이러한 환경 변수의 값을 결정할 수도 있습니다.

환경 우선 순위는 다음과 같습니다. AWS CDK

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

  1. 하드 코딩된 값은 구문의 env 속성으로 지정됩니다. Stack

  2. AWS_DEFAULT_ACCOUNT및 구문의 env 속성으로 지정된 AWS_DEFAULT_REGION 환경 변수. Stack

  3. 사용자 credentials 및 파일의 config 프로파일과 관련된 환경 정보이며 --profile 옵션을 CLI 사용하여 CDK로 전달됩니다.

  4. defaultAND config 파일의 프로필credentials.

환경을 지정하는 경우

CDK를 사용하여 개발할 때는 먼저 리소스를 나타내는 구문을 포함하는 CDK 스택을 정의합니다. AWS 다음으로 각 CDK 스택을 하나의 템플릿으로 합성합니다. AWS CloudFormation 그런 다음 CloudFormation 템플릿을 환경에 배포합니다. 환경을 지정하는 방법에 따라 환경 정보가 적용되는 시기가 결정되며 CDK 행동 및 결과에 영향을 미칠 수 있습니다.

템플릿 합성 시 환경을 지정하십시오.

Stack구문의 env 속성을 사용하여 환경 정보를 지정하는 경우 템플릿 합성 시 환경 정보가 적용됩니다. 환경별 CloudFormation 템플릿을 cdk synth 실행하거나 cdk deploy 생성합니다.

env속성 내에서 환경 변수를 사용하는 경우 CDK CLI 명령과 함께 --profile 옵션을 사용하여 자격 증명 및 구성 파일의 환경 정보가 포함된 프로필을 전달해야 합니다. 그런 다음 템플릿 합성 시 이 정보를 적용하여 환경별 템플릿을 생성합니다.

CloudFormation 템플릿 내의 환경 정보는 다른 방법보다 우선합니다. 예를 들어, 다른 환경을 제공하는 cdk deploy --profile profile 경우 프로필은 무시됩니다.

이러한 방식으로 환경 정보를 제공하면 CDK 앱 내에서 환경 종속 코드와 로직을 사용할 수 있습니다. 즉, 합성되는 템플릿은 합성 대상 컴퓨터, 사용자 또는 세션에 따라 달라질 수 있습니다. 이 접근 방식은 개발 중에 적합하거나 바람직한 경우가 많지만 프로덕션 용도로는 권장되지 않습니다.

스택 배포 시 환경을 지정하십시오.

Stack구문의 env 속성을 사용하여 환경을 지정하지 않으면 CLI CDK는 합성 시 환경에 구애받지 않는 템플릿을 CloudFormation 생성합니다. 그런 다음 를 사용하여 배포할 환경을 지정할 수 있습니다. cdk deploy --profile profile

환경에 구애받지 않는 템플릿을 배포할 때 프로필을 지정하지 않으면 CLI CDK는 배포 시 사용자 및 파일 default 프로필의 환경 값을 사용하려고 시도합니다. credentials config

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

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

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

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

각 스택에 하드 코딩된 환경을 지정합니다.

구문의 env 속성을 사용하여 Stack 스택의 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_ACCOUNTCDK_DEFAULT_REGION 을 AWS CDK 제공합니다. 스택 인스턴스의 env 속성 내에서 이러한 환경 변수를 사용하는 경우 CDK CLI --profile 옵션을 사용하여 자격 증명 및 구성 파일의 환경 정보를 전달할 수 있습니다.

다음은 이러한 환경 변수를 지정하는 방법의 예시입니다.

TypeScript

Node의 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

Node의 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")), }, })

환경 변수를 사용하여 환경을 지정하면 동일한 CDK 스택이 다양한 환경의 AWS CloudFormation 템플릿에 합성되도록 할 수 있습니다. 즉, CDK 코드를 수정하지 않고도 동일한 CDK 스택을 다른 AWS 환경에 배포할 수 있습니다. 실행 시 사용할 프로필만 지정하면 됩니다. cdk synth

이 접근 방식은 동일한 스택을 다른 환경에 배포하는 개발 환경에 적합합니다. 하지만 동일한 CDK 코드라도 합성 대상 컴퓨터, 사용자 또는 세션에 따라 서로 다른 템플릿을 합성할 수 있으므로 프로덕션 환경에서는 이 방법을 사용하지 않는 것이 좋습니다.

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

환경에 구애받지 않는 템플릿을 배포할 때는 CDK CLI 명령과 함께 --profile 옵션을 사용하여 사용할 프로필을 지정하십시오. 다음은 및 파일에 정의된 prod 프로필을 myStack 사용하여 이름이 지정된 CDK 스택을 배포하는 예제입니다. credentials config

$ cdk deploy myStack --profile prod

다른 CDK CLI 명령 및 --profile 옵션과 함께 옵션에 대한 자세한 내용은 을 참조하십시오. AWS CDK CLI 명령 참조

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

스택 내에서 구문을 사용하여 정의하는 서비스는 배포하려는 지역을 지원해야 합니다. AWS 서비스 지역별 지원 목록은 지역별 AWS 서비스를 참조하십시오.

를 사용하여 지정된 환경에 스택을 배포하려면 유효한 AWS Identity and Access Management (IAM) 자격 증명이 있어야 합니다. AWS CDK

예제

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, 'myBucket', { 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, 'myBucket', { 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, 'myBucket', 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, "myBucket") .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, "myBucket", 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("myBucket"), &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가 가상 파라미터를 AWS::Region 버킷 지역의 출력 값으로 사용하여 CloudFormation 템플릿을 CLI 생성합니다. 이 파라미터는 배포 시 해결됩니다.

Outputs: BucketRegion: Value: Ref: AWS::Region

자격 증명 및 구성 dev 파일의 프로필에 지정된 환경에 이 스택을 배포하기 위해 다음을 실행합니다.

$ cdk deploy CdkAppStack --profile dev

프로필을 지정하지 않으면 CLI CDK는 프로필의 환경 정보를 자격 증명 및 구성 파일에 사용하려고 시도합니다. default

템플릿 합성 시 로직을 사용하여 환경 정보를 결정하십시오.

이 예제에서는 유효한 표현식을 사용하도록 stack 인스턴스의 env 속성을 구성합니다. 환경 변수 2개와 을 추가로 지정합니다CDK_DEPLOY_REGION. CDK_DEPLOY_ACCOUNT 다음과 같은 환경 변수가 있는 경우 합성 시 기본값을 재정의할 수 있습니다.

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

스크립트를 다른 이름으로 저장한 다음 chmod +x cdk-deploy-to.sh 실행하여 실행 가능하게 만듭니다. 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 버전은 macOS/Linux 버전과 동일한 기능을 제공하는 PowerShell 데 사용됩니다. 또한 명령줄에서 쉽게 호출할 수 있도록 배치 파일로 실행할 수 있도록 하는 지침도 포함되어 있습니다. 로 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 %*