런타임 컨텍스트 - AWS Cloud Development Kit (AWS CDK) v2

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

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

런타임 컨텍스트

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

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

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

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

모든 컨텍스트 값이 사용자 환경의 캐시된 값인 것은 아닙니다. AWS 기능 플래그컨텍스트 값이기도 합니다. 앱이나 구문에 사용할 고유한 컨텍스트 값을 만들 수도 있습니다.

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

작은 정보

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

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

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

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

캐시된 컨텍스트 값은 사용자가 작성할 수 있는 구문을 포함하여 AWS CDK 와 해당 구문을 통해 관리됩니다. 파일을 수동으로 편집하여 캐시된 컨텍스트 값을 추가하거나 변경하지 마십시오. 하지만 cdk.context.json 가끔 어떤 값이 캐시되는지 검토해 보는 것이 유용할 수 있습니다. 캐시된 값을 나타내지 않는 컨텍스트 값은 의 context 키 아래에 저장해야 합니다. cdk.json 이렇게 하면 캐시된 값을 지워도 삭제되지 않습니다.

컨텍스트 값의 소스

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

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

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

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

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

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

  • AWS CDK 앱에서 construct.node.setContext() 메서드를 사용합니다.

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

중요

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

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

앱은 construct.node.tryGetContext 메서드를 사용하여 컨텍스트 값을 읽을 수 있습니다. 요청된 항목을 현재 구조나 그 상위 구조에서 찾을 수 없는 경우 결과는 다음과 같습니다undefined. (또는 None Python에서와 같이 사용자 언어와 동일한 결과가 나올 수도 있습니다.)

컨텍스트 메서드

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

컨텍스트 메서드는 다음과 같습니다.

HostedZone.fromLookup

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

스택. 가용 영역

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

StringParameter.valueFromLookup

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

VPC. FromLookup

계정의 기존 Amazon 가상 사설 클라우드를 가져옵니다.

LookupMachineImage

Amazon Virtual Private Cloud에서 NAT 인스턴스와 함께 사용할 머신 이미지를 찾습니다.

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

컨텍스트 보기 및 관리

cdk context명령을 사용하여 cdk.context.json 파일의 정보를 보고 관리할 수 있습니다. 이 정보를 보려면 옵션 없이 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 플래그

--context(-c간단히 말해서) 옵션을 사용하면 합성 또는 배포 중에 런타임 컨텍스트 값을 CDK 앱에 전달할 수 있습니다.

cdk synth --context key=value MyStack

컨텍스트 값을 여러 개 지정하려면 --context 옵션을 여러 번 반복하여 매번 키-값 쌍을 하나씩 제공하십시오.

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

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

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

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

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"
    ]
  }
}