v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
cloudformation-include.CfnInclude
구문을 사용하여 리소스를 L1 구문으로 변환하여 AWS CloudFormation 템플릿에서 AWS Cloud Development Kit (AWS CDK) 애플리케이션으로 리소스를 가져옵니다.
가져온 후에는 원래 AWS CDK 코드에 정의된 것과 동일한 방식으로 앱에서 이러한 리소스를 사용할 수 있습니다. 상위 수준 구문 내에서 이러한 L1 AWS CDK 구문을 사용할 수도 있습니다. 예를 들어 이렇게 하면 L2 권한 grant 메서드를 정의된 리소스와 함께 사용할 수 있습니다.
cloudformation-include.CfnInclude
구성은 기본적으로 AWS CloudFormation 템플릿의 모든 리소스에 AWS CDK API 래퍼를 추가합니다. 이 기능을 사용하여 기존 AWS CloudFormation 템플릿을 한 번에 AWS CDK 조각으로 가져옵니다. 이렇게 하면 AWS CDK 구문을 사용하여 기존 리소스를 관리하여 상위 수준 추상화의 이점을 활용할 수 있습니다. 또한이 기능을 사용하여 AWS CDK 구문 API를 제공하여 AWS CloudFormation 템플릿을 AWS CDK 개발자에게 제공할 수 있습니다.
참고
AWS CDK v1에는 이전에 동일한 범용으로 사용된 도 포함되어 aws-cdk-lib.CfnInclude
있습니다. 하지만 cloudformation-include.CfnInclude
의 기능이 부족합니다.
AWS CloudFormation 템플릿 가져오기
다음은이 주제의 예제를 제공하는 데 사용할 샘플 AWS CloudFormation 템플릿입니다. 따라하려면 템플릿을 복사하고 my-template.json
으로 저장하세요. 이러한 예제를 살펴본 후 기존에 배포된 AWS CloudFormation 템플릿을 사용하여 자세히 살펴볼 수 있습니다. AWS CloudFormation
콘솔에서 템플릿을 얻을 수 있습니다.
{
"Resources": {
"amzn-s3-demo-bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "amzn-s3-demo-bucket",
}
}
}
}
JSON 또는 YAML 템플릿으로 작업할 수 있습니다. YAML 파서가 수락하는 내용에 약간 다를 수 있으므로 사용 가능한 경우 JSON을 사용하는 것이 좋습니다.
다음은를 사용하여 샘플 템플릿을 AWS CDK 앱으로 가져오는 방법의 예입니다cloudformation-include
. 템플릿은 CDK 스택의 컨텍스트 내에서 가져옵니다.
import * as cdk from 'aws-cdk-lib';
import * as cfninc from 'aws-cdk-lib/cloudformation-include';
import { Construct } from 'constructs';
export class MyStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const template = new cfninc.CfnInclude(this, 'Template', {
templateFile: 'my-template.json',
});
}
}
기본적으로 리소스를 가져오면 템플릿에서 리소스의 원래 논리적 ID가 유지됩니다. 이 동작은 논리적 IDs를 보존해야 AWS CDK하는 템플릿을 AWS CloudFormation 로 가져오는 데 적합합니다.는 가져온 리소스를 AWS CloudFormation 템플릿에서 동일한 리소스로 인식하기 위해이 정보가 AWS CloudFormation 필요합니다.
다른 AWS CDK 개발자가 사용할 수 있도록 템플릿용 AWS CDK 구문 래퍼를 개발하는 경우 대신에서 새 리소스 ID를 AWS CDK 생성하도록 하세요. IDs 이렇게 하면 이름 충돌 없이 스택에서 구문을 여러 번 사용할 수 있습니다. 이렇게 하려면 템플릿을 가져올 때 preserveLogicalIds
속성을 false
로 설정합니다. 다음은 예제입니다.
const template = new cfninc.CfnInclude(this, 'MyConstruct', {
templateFile: 'my-template.json',
preserveLogicalIds: false
});
가져온 리소스를 AWS CDK 앱의 제어 하에 두려면 스택을에 추가합니다App
.
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-stack';
const app = new cdk.App();
new MyStack(app, 'MyStack');
스택의 AWS 리소스에 의도하지 않은 변경 사항이 없는지 확인하려면 diff를 수행할 수 있습니다. cdk diff
명령을 사용하고 AWS CDK특정 메타데이터를 AWS CDK CLI 생략합니다. 다음은 예제입니다.
cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata
AWS CloudFormation 템플릿을 가져온 후에는 AWS CDK 앱이 가져온 리소스의 정확한 소스가 되어야 합니다. 리소스를 변경하려면 AWS CDK 앱에서 리소스를 수정하고 cdk deploy 명령을 사용하여 AWS CDK CLI 배포합니다.
가져온 리소스에 액세스
예제 코드template
의 이름은 가져온 AWS CloudFormation 템플릿을 나타냅니다. 리소스에서 리소스에 액세스하려면 객체의 getResource()
메서드를 사용합니다. 반환된 리소스에 특정 유형의 리소스로 액세스하려면 결과를 원하는 유형으로 캐스팅합니다. 이는 Python 또는 JavaScript에서는 필요하지 않습니다. 다음은 예제입니다.
const cfnBucket = template.getResource('amzn-s3-demo-bucket') as s3.CfnBucket;
이 예에서 cfnBucket
는 이제 aws-s3.CfnBucket
클래스의 인스턴스입니다. 이는 해당 AWS CloudFormation 리소스를 나타내는 L1 구문입니다. 다른 유형의 리소스처럼 처리할 수 있습니다. 예를 들어 bucket.attrArn
속성으로 해당 ARN 값을 가져올 수 있습니다.
대신 L1 CfnBucket
리소스를 L2 aws-s3.Bucket
인스턴스로 래핑하려면 정적 메서드 fromBucketArn()
, fromBucketAttributes()
또는 fromBucketName()
을 사용합니다. 일반적으로 fromBucketName()
메서드가 가장 편리합니다. 다음은 예제입니다.
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
다른 L2 구문에는 기존 리소스에서 구문을 생성하는 유사한 메서드가 있습니다.
L1 구문을 L2 구문으로 래핑하면 새 리소스가 생성되지 않습니다. 이 예에서는 두 번째 S3, 버킷을 생성하지 않습니다. 대신 새 Bucket
인스턴스는 기존 CfnBucket
을 캡슐화합니다.
예제에서 bucket
은 이제 다른 L2 구문과 같이 작동하는 L2 Bucket
구문입니다. 예를 들어 버킷의 편리한 grantWrite()
방법을 사용하여 AWS Lambda 함수 쓰기 액세스 권한을 버킷에 부여할 수 있습니다. 필요한 AWS Identity and Access Management (IAM) 정책을 수동으로 정의할 필요가 없습니다. 다음은 예제입니다.
bucket.grantWrite(lambdaFunc);
파라미터 바꾸기
AWS CloudFormation 템플릿에 파라미터가 포함된 경우 parameters
속성을 사용하여 가져올 때 빌드 시간 값으로 바꿀 수 있습니다. 다음 예제에서는 UploadBucket
파라미터를 AWS CDK 코드의 다른 곳에서 정의된 버킷의 ARN으로 바꿉니다.
const template = new cfninc.CfnInclude(this, 'Template', {
templateFile: 'my-template.json',
parameters: {
'UploadBucket': bucket.bucketArn,
},
});
다른 템플릿 요소 가져오기
리소스뿐만 아니라 모든 AWS CloudFormation 템플릿 요소를 가져올 수 있습니다. 가져온 요소는 AWS CDK
스택의 일부가 됩니다. 이러한 요소를 가져오려면 CfnInclude
객체의 다음 방법을 사용합니다.
-
getCondition()
- AWS CloudFormation 조건. -
getMapping()
– AWS CloudFormation 매핑. -
getOutput()
- AWS CloudFormation 출력. -
getParameter()
– AWS CloudFormation 파라미터. -
getRule()
–템플릿에 대한 AWS Service Catalog AWS CloudFormation 규칙입니다.
이러한 각 메서드는 특정 유형의 AWS CloudFormation 요소를 나타내는 클래스의 인스턴스를 반환합니다. 이러한 객체는 변경할 수 있습니다. 변경 사항은 AWS CDK 스택에서 생성된 템플릿에 표시됩니다. 다음은 템플릿에서 파라미터를 가져오고 기본값을 수정하는 예입니다.
const param = template.getParameter('MyParameter');
param.default = "AWS CDK"
중첩된 스택 가져오기
기본 템플릿을 가져올 때 또는 나중 중첩된 스택을 지정하여 중첩된 스택을 가져올 수 있습니다. 중첩된 템플릿은 로컬 파일에 저장되어야 하지만 기본 템플릿에서 NestedStack
리소스로 참조되어야 합니다. 또한 AWS CDK 코드에 사용되는 리소스 이름은 기본 템플릿의 중첩 스택에 사용되는 이름과 일치해야 합니다.
기본 템플릿의 이 리소스 정의를 고려할 때 다음 코드는 참조된 중첩된 스택을 두 가지 방법으로 가져오는 방법을 보여줍니다.
"NestedStack": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://my-s3-template-source.s3.amazonaws.com/nested-stack.json"
}
// include nested stack when importing main stack
const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', {
templateFile: 'main-template.json',
loadNestedStacks: {
'NestedStack': {
templateFile: 'nested-template.json',
},
},
});
// or add it some time after importing the main stack
const nestedTemplate = mainTemplate.loadNestedStack('NestedTemplate', {
templateFile: 'nested-template.json',
});
두 메서드 중 하나로 여러 중첩된 스택을 가져올 수 있습니다. 기본 템플릿을 가져올 때 각 중첩된 스택의 리소스 이름과 해당 템플릿 파일 간에 매핑을 제공합니다. 이 매핑에는 원하는 수의 항목이 포함될 수 있습니다. 초기 가져오기 후 이 작업을 수행하려면 각 중첩된 스택에 대해 loadNestedStack()
를 한 번 직접적으로 호출합니다.
중첩된 스택을 가져온 후 기본 템플릿의 getNestedStack()
메서드를 사용하여 스택에 액세스할 수 있습니다.
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
getNestedStack()
메서드는 IncludedNestedStack
인스턴스를 반환합니다. 이 인스턴스에서 예제와 AWS CDK NestedStack
같이 stack
속성을 통해 인스턴스에 액세스할 수 있습니다. 를 통해 원본 AWS CloudFormation 템플릿 객체에 액세스할 수도 있습니다.이 객체includedTemplate
에서 리소스 및 기타 AWS CloudFormation 요소를 로드할 수 있습니다.