컨텍스트 값 및 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

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

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

컨텍스트 값 및 AWS CDK

컨텍스트 값은 앱, 스택 또는 구성과 연결할 수 있는 키-값 페어입니다. 파일(일반적으로 프로젝트 디렉터리의 cdk.json 또는 cdk.context.json) 또는 명령줄에서 앱에 제공될 수 있습니다.

도구 CDK 키트는 컨텍스트를 사용하여 합성 중에 AWS 계정에서 검색된 값을 캐싱합니다. 값에는 계정의 가용 영역 또는 IDs 현재 Amazon EC2 인스턴스에 사용할 수 있는 Amazon Machine Image(AMI)가 포함됩니다. 이러한 값은 AWS 계정에서 제공되므로 CDK 애플리케이션 실행 간에 변경될 수 있습니다. 따라서 의도하지 않은 변경의 잠재적 원인이 될 수 있습니다. CDK 도구 키트의 캐싱 동작은 새 값을 수락하기로 결정할 때까지 CDK 앱에 대해 이러한 값을 "동결"합니다.

컨텍스트 캐싱이 없는 다음 시나리오를 상상해 보세요. '최신 Amazon Linux'를 Amazon EC2 인스턴스에 AMI 대한 로 지정했고 새 버전의이 릴리스AMI되었다고 가정해 보겠습니다. 그러면 다음에 CDK 스택을 배포할 때 이미 배포된 인스턴스가 오래된 인스턴스('잘못됨')를 사용AMI하므로 업그레이드해야 합니다. 업그레이드하면 기존 인스턴스가 모두 새 인스턴스로 교체됩니다. 이는 예상치 못하고 원치 않는 결과일 수 있습니다.

대신는 프로젝트의 cdk.context.json 파일AMIs에서 사용 가능한 계정을 CDK 기록하고 향후 합성 작업에 저장된 값을 사용합니다. 이렇게 하면의 목록이 더 이상 잠재적 변경 소스AMIs가 아닙니다. 또한 스택이 항상 동일한 AWS CloudFormation 템플릿으로 합성되는지 확인할 수 있습니다.

모든 컨텍스트 값이 AWS 환경에서 캐시되는 것은 아닙니다. AWS CDK 기능 플래그도 컨텍스트 값입니다. 앱 또는 구문에서 사용할 컨텍스트 값을 직접 생성할 수도 있습니다.

컨텍스트 키는 문자열입니다. 값은 JSON숫자, 문자열, 배열 또는 객체에서 지원하는 모든 유형일 수 있습니다.

작은 정보

구문이 자체 컨텍스트 값을 생성하는 경우 라이브러리의 패키지 이름을 키에 통합하여 다른 패키지의 컨텍스트 값과 충돌하지 않도록 하세요.

많은 컨텍스트 값은 특정 AWS 환경과 연결되며, 지정된 CDK 앱을 둘 이상의 환경에 배포할 수 있습니다. 이러한 값의 키에는 서로 다른 환경의 값이 충돌하지 않도록 AWS 계정과 리전이 포함됩니다.

다음 컨텍스트 키는 계정 및 리전을 포함하여 AWS CDK에서 사용하는 형식을 보여줍니다.

availability-zones:account=123456789012:region=eu-central-1
중요

캐시된 컨텍스트 값은 AWS CDK 및 사용자가 작성할 수 있는 구문을 포함하여 해당 구문에 의해 관리됩니다. 파일을 수동으로 편집하여 캐시된 컨텍스트 값을 추가하거나 변경하지 마세요. 그러나 캐시되는 값을 확인하기 위해 cdk.context.json을 가끔 검토하는 것이 유용할 수 있습니다. 캐시된 값을 나타내지 않는 컨텍스트 값은 cdk.jsoncontext 키 아래에 저장해야 합니다. 그러면 캐시된 값이 지워질 때 지워지지 않습니다.

컨텍스트 값의 소스

컨텍스트 값은 6가지 방법으로 AWS CDK 앱에 제공될 수 있습니다.

  • 현재 AWS 계정에서 자동으로.

  • cdk 명령에 대한 --context 옵션을 통해(이러한 값은 항상 문자열임)

  • 프로젝트의 cdk.context.json 파일에서

  • 프로젝트의 cdk.json 파일의 context 키에서

  • ~/.cdk.json 파일의 context 키에서

  • construct.node.setContext() 메서드를 사용하여 AWS CDK 앱에서.

프로젝트 파일은 cdk.context.json가 AWS 계정에서 검색된 컨텍스트 값을 AWS CDK 캐시하는 곳입니다. 이 연습은 예를 들어 새 가용 영역이 도입될 때 배포에 대한 예상치 못한 변경을 방지합니다. AWS CDK 는 나열된 다른 파일에 컨텍스트 데이터를 쓰지 않습니다.

중요

cdk.jsoncdk.context.json은 애플리케이션 상태의 일부이므로 나머지 앱 소스 코드와 함께 소스 제어에 커밋되어야 합니다. 그렇지 않으면 다른 환경(예: CI 파이프라인)에 배포할 때 일관성 없는 결과가 나올 수 있습니다.

컨텍스트 값은 이를 생성한 구문으로 범위가 지정되며, 자식 구문에는 표시되지만 부모 또는 형제 구문에는 표시되지 않습니다. AWS CDK 도구 키트(cdk명령)에 의해 설정된 컨텍스트 값은 파일 또는 --context 옵션에서 자동으로 설정할 수 있습니다. 이러한 소스의 컨텍스트 값은 App 구문에 암시적으로 설정됩니다. 따라서 앱의 모든 스택에 있는 모든 구문에 표시됩니다.

앱은 construct.node.tryGetContext 메서드를 사용하여 컨텍스트 값을 읽을 수 있습니다. 요청된 항목을 현재 구문이나 부모 구문에서 찾을 수 없는 경우 결과는 undefined입니다. 또는 Python의 None과 같이 사용자의 언어에 해당하는 결과가 나올 수 있습니다.

컨텍스트 메서드

는 AWS CDK 앱이 환경으로부터 컨텍스트 정보를 얻을 수 있는 여러 컨텍스트 메서드를 AWS CDK AWS 지원합니다. 예를 들어 스택availabilityZones 메서드를 사용하여 특정 AWS 계정 및 리전에서 사용할 수 있는 가용 영역 목록을 가져올 수 있습니다.

다음은 컨텍스트 메서드입니다.

HostedZone.fromLookup

계정의 호스팅 영역을 가져옵니다.

스택.availabilityZones

지원되는 가용 영역을 가져옵니다.

StringParameter.valueFromLookup

현재 리전의 Amazon EC2 Systems Manager 파라미터 스토어에서 값을 가져옵니다.

Vpc.fromLookup

계정에 있는 기존 Amazon Virtual Private Cloud를 가져옵니다.

LookupMachineImage

Amazon Virtual Private Cloud의 NAT 인스턴스에 사용할 시스템 이미지를 찾습니다.

필요한 컨텍스트 값을 사용할 수 없는 경우 AWS CDK 앱은 CDK 툴킷에 컨텍스트 정보가 누락되었음을 알립니다. 그런 다음는 현재 AWS 계정에 정보를 CLI 쿼리하고 결과 컨텍스트 정보를 cdk.context.json 파일에 저장합니다. 그런 다음 컨텍스트 값으로 AWS CDK 앱을 다시 실행합니다.

컨텍스트 보기 및 관리

cdk.context.json 파일의 정보를 보고 관리하려면 cdk context 명령을 사용합니다. 이 정보를 보려면 옵션 없이 cdk context 명령을 사용합니다. 출력은 다음과 같아야 합니다.

Context found in cdk.json:

┌───┬─────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┐
│ # │ Key                                                         │ Value                                                   │
├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ 1 │ availability-zones:account=123456789012:region=eu-central-1 │ [ "eu-central-1a", "eu-central-1b", "eu-central-1c" ]   │
├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ 2 │ availability-zones:account=123456789012:region=eu-west-1    │ [ "eu-west-1a", "eu-west-1b", "eu-west-1c" ]            │
└───┴─────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘

Run cdk context --reset KEY_OR_NUMBER to remove a context key. If it is a cached value, it will be refreshed on the next cdk synth.

컨텍스트 값을 제거하려면 값의 해당 키 또는 숫자를 지정하여 cdk context --reset을 실행합니다. 다음 예에서는 이전 예의 두 번째 키에 해당하는 값을 제거합니다. 이 값은 유럽(아일랜드) 리전의 가용 영역 목록을 나타냅니다.

cdk context --reset 2
Context value
availability-zones:account=123456789012:region=eu-west-1
reset. It will be refreshed on the next SDK synthesis run.

따라서 최신 버전의 Amazon Linux 로 업데이트하려면 이전 예제를 AMI사용하여 컨텍스트 값을 제어된 방식으로 업데이트하고 재설정합니다. 그런 다음 앱을 다시 합성하고 배포합니다.

cdk synth

앱에 대해 저장된 컨텍스트 값을 모두 지우려면 다음과 같이 cdk context --clear를 실행합니다.

cdk context --clear

cdk.context.json에 저장된 컨텍스트 값만 재설정하거나 지울 수 있습니다. AWS CDK 는 다른 컨텍스트 값을 터치하지 않습니다. 따라서 이러한 명령을 사용하여 컨텍스트 값이 재설정되지 않도록 하려면 cdk.json에 값을 복사합니다.

AWS CDK 도구 키트 --context 플래그

합성 또는 배포 중에 CDK 앱에 런타임 컨텍스트 값을 전달하려면 --context (-c짧게) 옵션을 사용합니다.

cdk synth --context key=value MyStack

여러 컨텍스트 값을 지정하려면 --context 옵션을 원하는 만큼 반복합니다. 반복할 때마다 키 값 페어를 하나씩 제공합니다.

cdk synth --context key1=value1 --context key2=value2 MyStack

여러 스택을 합성할 때 지정된 컨텍스트 값이 모든 스택에 전달됩니다. 개별 스택에 서로 다른 컨텍스트 값을 제공하려면 값에 대해 서로 다른 키를 사용하거나 여러 cdk synth 또는 cdk deploy 명령을 사용합니다.

명령줄에서 전달된 컨텍스트 값은 항상 문자열입니다. 값이 일반적으로 다른 유형인 경우 값을 변환하거나 구문 분석할 수 있도록 코드가 준비되어야 합니다. 다른 방법(예: cdk.context.json)으로 문자열이 아닌 컨텍스트 값을 제공할 수도 있습니다. 이러한 종류의 값이 예상대로 작동하는지 확인하려면 변환하기 전에 값이 문자열인지 확인합니다.

예제

다음은 AWS CDK 컨텍스트를 VPC 사용하여 기존 Amazon을 사용하는 예제입니다.

TypeScript
import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from 'constructs'; export class ExistsVpcStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const vpcid = this.node.tryGetContext('vpcid'); const vpc = ec2.Vpc.fromLookup(this, 'VPC', { vpcId: vpcid, }); const pubsubnets = vpc.selectSubnets({subnetType: ec2.SubnetType.PUBLIC}); new cdk.CfnOutput(this, 'publicsubnets', { value: pubsubnets.subnetIds.toString(), }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const ec2 = require('aws-cdk-lib/aws-ec2'); class ExistsVpcStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const vpcid = this.node.tryGetContext('vpcid'); const vpc = ec2.Vpc.fromLookup(this, 'VPC', { vpcId: vpcid }); const pubsubnets = vpc.selectSubnets({subnetType: ec2.SubnetType.PUBLIC}); new cdk.CfnOutput(this, 'publicsubnets', { value: pubsubnets.subnetIds.toString() }); } } module.exports = { ExistsVpcStack }
Python
import aws_cdk as cdk import aws_cdk.aws_ec2 as ec2 from constructs import Construct class ExistsVpcStack(cdk.Stack): def __init__(scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) vpcid = self.node.try_get_context("vpcid") vpc = ec2.Vpc.from_lookup(self, "VPC", vpc_id=vpcid) pubsubnets = vpc.select_subnets(subnetType=ec2.SubnetType.PUBLIC) cdk.CfnOutput(self, "publicsubnets", value=pubsubnets.subnet_ids.to_string())
Java
import software.amazon.awscdk.CfnOutput; import software.amazon.awscdk.services.ec2.Vpc; import software.amazon.awscdk.services.ec2.VpcLookupOptions; import software.amazon.awscdk.services.ec2.SelectedSubnets; import software.amazon.awscdk.services.ec2.SubnetSelection; import software.amazon.awscdk.services.ec2.SubnetType; import software.constructs.Construct; public class ExistsVpcStack extends Stack { public ExistsVpcStack(Construct context, String id) { this(context, id, null); } public ExistsVpcStack(Construct context, String id, StackProps props) { super(context, id, props); String vpcId = (String)this.getNode().tryGetContext("vpcid"); Vpc vpc = (Vpc)Vpc.fromLookup(this, "VPC", VpcLookupOptions.builder() .vpcId(vpcId).build()); SelectedSubnets pubSubNets = vpc.selectSubnets(SubnetSelection.builder() .subnetType(SubnetType.PUBLIC).build()); CfnOutput.Builder.create(this, "publicsubnets") .value(pubSubNets.getSubnetIds().toString()).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.EC2; using Constructs; class ExistsVpcStack : Stack { public ExistsVpcStack(Construct scope, string id, StackProps props) : base(scope, id, props) { var vpcId = (string)this.Node.TryGetContext("vpcid"); var vpc = Vpc.FromLookup(this, "VPC", new VpcLookupOptions { VpcId = vpcId }); SelectedSubnets pubSubNets = vpc.SelectSubnets([new SubnetSelection { SubnetType = SubnetType.PUBLIC }]); new CfnOutput(this, "publicsubnets", new CfnOutputProps { Value = pubSubNets.SubnetIds.ToString() }); } }

cdk diff를 사용하여 명령줄에서 컨텍스트 값 전달의 영향을 확인할 수 있습니다.

cdk diff -c vpcid=vpc-0cb9c31031d0d3e22
Stack ExistsvpcStack
Outputs
[+] Output publicsubnets publicsubnets: {"Value":"subnet-06e0ea7dd302d3e8f,subnet-01fc0acfb58f3128f"}

다음과 같이 결과 컨텍스트 값을 볼 수 있습니다.

cdk context -j
{
  "vpc-provider:account=123456789012:filter.vpc-id=vpc-0cb9c31031d0d3e22:region=us-east-1": {
    "vpcId": "vpc-0cb9c31031d0d3e22",
    "availabilityZones": [
      "us-east-1a",
      "us-east-1b"
    ],
    "privateSubnetIds": [
      "subnet-03ecfc033225be285",
      "subnet-0cded5da53180ebfa"
    ],
    "privateSubnetNames": [
      "Private"
    ],
    "privateSubnetRouteTableIds": [
      "rtb-0e955393ced0ada04",
      "rtb-05602e7b9f310e5b0"
    ],
    "publicSubnetIds": [
      "subnet-06e0ea7dd302d3e8f",
      "subnet-01fc0acfb58f3128f"
    ],
    "publicSubnetNames": [
      "Public"
    ],
    "publicSubnetRouteTableIds": [
      "rtb-00d1fdfd823c82289",
      "rtb-04bb1969b42969bcb"
    ]
  }
}