기존 AWS CloudFormation 템플릿 가져오기 - AWS Cloud Development Kit (AWS CDK) v2

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

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

기존 AWS CloudFormation 템플릿 가져오기

구조를 사용하여 리소스를 L1 cloudformation-include.CfnInclude구조로 변환하면 AWS CloudFormation 템플릿의 리소스를 AWS Cloud Development Kit (AWS CDK) 애플리케이션으로 가져올 수 있습니다.

가져온 후에는 원래 코드에 정의된 리소스와 동일한 방식으로 앱에서 이러한 리소스를 사용할 수 있습니다. AWS CDK 상위 AWS CDK 수준 구문 내에서 이러한 L1 구문을 사용할 수도 있습니다. 예를 들어 이렇게 하면 L2 권한 부여 메서드를 정의된 리소스와 함께 사용할 수 있습니다.

cloudformation-include.CfnInclude 구조는 기본적으로 템플릿의 모든 리소스에 AWS CDK API 래퍼를 추가합니다. AWS CloudFormation 이 기능을 사용하면 기존 AWS CloudFormation 템플릿을 AWS CDK 한 번에 하나씩 가져올 수 있습니다. 이렇게 하면 AWS CDK 구문을 사용하여 기존 리소스를 관리하여 상위 수준 추상화의 이점을 활용할 수 있습니다. 이 기능을 사용하여 구문을 제공하여 AWS CDK 개발자에게 AWS CloudFormation 템플릿을 제공할 수도 있습니다. AWS CDK API

참고

AWS CDK 이전에 동일한 범용으로 사용되었던 v1도 포함되어 aws-cdk-lib.CfnInclude있습니다. 하지만 의 기능은 많이 부족합니다. cloudformation-include.CfnInclude

템플릿 가져오기 AWS CloudFormation

다음은 이 항목에서 예제를 제공하는 데 사용할 샘플 AWS CloudFormation 템플릿입니다. 다음과 같이 my-template.json 템플릿을 복사하고 저장하십시오. 이 예제를 모두 살펴본 후 기존에 배포한 AWS CloudFormation 템플릿을 사용하여 더 자세히 살펴볼 수 있습니다. AWS CloudFormation 콘솔에서 다운로드할 수 있습니다.

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "MyBucket", } } } }

둘 중 하나의 JSON YAML 템플릿으로 작업할 수 있습니다. YAML파서가 허용하는 범위가 약간 다를 수 있으므로 가능한 JSON 경우 사용하는 것이 좋습니다.

다음은 를 사용하여 cloudformation-include 샘플 템플릿을 AWS CDK 앱으로 가져오는 방법의 예입니다. 템플릿은 CDK 스택 컨텍스트 내에서 가져옵니다.

TypeScript
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', }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const cfninc = require('aws-cdk-lib/cloudformation-include'); class MyStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', }); } } module.exports = { MyStack }
Python
import aws_cdk as cdk from aws_cdk import cloudformation_include as cfn_inc from constructs import Construct class MyStack(cdk.Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json")
Java
import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.cloudformation.include.CfnInclude; import software.constructs.Construct; public class MyStack extends Stack { public MyStack(final Construct scope, final String id) { this(scope, id, null); } public MyStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .build(); } }
C#
using Amazon.CDK; using Constructs; using cfnInc = Amazon.CDK.CloudFormation.Include; namespace MyApp { public class MyStack : Stack { internal MyStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json" }); } } }

기본적으로 리소스를 가져오면 템플릿에 있는 리소스의 원래 논리 ID가 보존됩니다. 이 동작은 논리적 데이터를 IDs 보존해야 하는 로 AWS CloudFormation 템플릿을 가져오는 데 AWS CDK적합합니다. AWS CloudFormation 가져온 리소스를 템플릿의 동일한 리소스로 인식하려면 이 정보가 필요합니다. AWS CloudFormation

다른 AWS CDK 개발자가 사용할 수 있도록 템플릿의 AWS CDK 구성 래퍼를 개발하는 경우에는 IDs 대신 새 리소스를 AWS CDK 생성하도록 하세요. 이렇게 하면 이름 충돌 없이 스택에서 구문을 여러 번 사용할 수 있습니다. 이렇게 하려면 템플릿을 가져올 falsepreserveLogicalIds 속성을 로 설정해야 합니다. 다음은 그 예제입니다.

TypeScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
JavaScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", preserve_logical_ids=False)
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .preserveLogicalIds(false) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfn_inc.CfnIncludeProps { TemplateFile = "my-template.json", PreserveLogicalIds = false });

가져온 리소스를 AWS CDK 앱 제어 하에 두려면 스택을 다음에 추가하세요. App

TypeScript
import * as cdk from 'aws-cdk-lib'; import { MyStack } from '../lib/my-stack'; const app = new cdk.App(); new MyStack(app, 'MyStack');
JavaScript
const cdk = require('aws-cdk-lib'); const { MyStack } = require('../lib/my-stack'); const app = new cdk.App(); new MyStack(app, 'MyStack');
Python
import aws_cdk as cdk from mystack.my_stack import MyStack app = cdk.App() MyStack(app, "MyStack")
Java
import software.amazon.awscdk.App; public class MyApp { public static void main(final String[] args) { App app = new App(); new MyStack(app, "MyStack"); } }
C#
using Amazon.CDK; namespace CdkApp { sealed class Program { public static void Main(string[] args) { var app = new App(); new MyStack(app, "MyStack"); } } }

스택의 AWS 리소스에 의도하지 않은 변경이 없는지 확인하기 위해 diff를 수행할 수 있습니다. AWS CDK CLIcdk diff명령을 사용하고 특정 메타데이터는 생략하세요 AWS CDK. 다음은 그 예제입니다.

cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata

AWS CloudFormation 템플릿을 가져온 후에는 AWS CDK 앱이 가져온 리소스의 신뢰할 수 있는 소스가 되어야 합니다. 리소스를 변경하려면 AWS CDK 앱에서 리소스를 수정하고 AWS CDK CLI cdk deploy 명령을 사용하여 배포하세요.

가져온 리소스에 액세스

예제 template 코드의 이름은 가져온 AWS CloudFormation 템플릿을 나타냅니다. 해당 리소스에서 리소스에 액세스하려면 객체의 getResource()메서드를 사용하십시오. 반환된 리소스에 특정 종류의 리소스로 액세스하려면 결과를 원하는 유형으로 캐스팅하십시오. Python 또는 에서는 이것이 필요하지 않습니다 JavaScript. 다음은 그 예제입니다.

TypeScript
const cfnBucket = template.getResource('MyBucket') as s3.CfnBucket;
JavaScript
const cfnBucket = template.getResource('MyBucket');
Python
cfn_bucket = template.get_resource("MyBucket")
Java
CfnBucket cfnBucket = (CfnBucket)template.getResource("MyBucket");
C#
var cfnBucket = (CfnBucket)template.GetResource("MyBucket");

이 예제에서는 cfnBucketaws-s3.CfnBucket클래스의 인스턴스가 되었습니다. 이는 해당 AWS CloudFormation 리소스를 나타내는 L1 구조입니다. 해당 유형의 다른 리소스처럼 취급할 수 있습니다. 예를 들어 bucket.attrArn 속성을 사용하여 해당 ARN 값을 가져올 수 있습니다.

L1 CfnBucket 리소스를 L2 aws-s3.Bucket인스턴스로 대신 래핑하려면 정적 메서드 fromBucketArn()fromBucketAttributes(), 또는 를 사용하십시오. fromBucketName() 일반적으로 이 fromBucketName() 방법이 가장 편리합니다. 다음은 그 예제입니다.

TypeScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
JavaScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
Python
bucket = s3.Bucket.from_bucket_name(self, "Bucket", cfn_bucket.ref)
Java
Bucket bucket = (Bucket)Bucket.fromBucketName(this, "Bucket", cfnBucket.getRef());
C#
var bucket = (Bucket)Bucket.FromBucketName(this, "Bucket", cfnBucket.Ref);

다른 L2 구문에도 기존 리소스에서 구문을 만드는 비슷한 방법이 있습니다.

L1 구문을 L2 구문으로 래핑하면 새 리소스가 생성되지 않습니다. 이 예시에서는 두 번째 S3; 버킷을 만들지 않고 있습니다. 대신 새 Bucket 인스턴스는 기존 인스턴스를 캡슐화합니다. CfnBucket

예제에서 보면 이제 bucket 는 다른 L2 구문처럼 동작하는 L2 Bucket 구문입니다. 예를 들어, 버킷의 편리한 메서드를 사용하여 AWS Lambda 함수에 버킷에 대한 쓰기 액세스 권한을 부여할 수 있습니다. grantWrite() 필요한 AWS Identity and Access Management (IAM) 정책을 수동으로 정의할 필요는 없습니다. 다음은 그 예제입니다.

TypeScript
bucket.grantWrite(lambdaFunc);
JavaScript
bucket.grantWrite(lambdaFunc);
Python
bucket.grant_write(lambda_func)
Java
bucket.grantWrite(lambdaFunc);
C#
bucket.GrantWrite(lambdaFunc);

파라미터 바꾸기

AWS CloudFormation 템플릿에 파라미터가 포함된 경우, 임포트 시 parameters 프로퍼티를 사용하여 빌드 시간 값으로 대체할 수 있습니다. 다음 예시에서는 UploadBucket 파라미터를 AWS CDK 코드의 다른 곳에 정의된 ARN 버킷의 파라미터로 바꿉니다.

TypeScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
JavaScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", parameters=dict(UploadBucket=bucket.bucket_arn) )
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .parameters(java.util.Map.of( // Map.of requires Java 9+ "UploadBucket", bucket.getBucketArn())) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json", Parameters = new Dictionary<string, string> { { "UploadBucket", bucket.BucketArn } } });

다른 템플릿 요소 가져오기

리소스뿐만 아니라 모든 AWS CloudFormation 템플릿 요소를 가져올 수 있습니다. 가져온 요소는 AWS CDK 스택의 일부가 됩니다. 이러한 요소를 가져오려면 CfnInclude 객체의 다음 메서드를 사용하십시오.

각 메서드는 특정 유형의 AWS CloudFormation 요소를 나타내는 클래스의 인스턴스를 반환합니다. 이러한 객체는 변경 가능합니다. 변경 내용은 AWS CDK 스택에서 생성되는 템플릿에 표시됩니다. 다음은 템플릿에서 매개 변수를 가져와 기본값을 수정하는 예제입니다.

TypeScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
JavaScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
Python
param = template.get_parameter("MyParameter") param.default = "AWS CDK"
Java
CfnParameter param = template.getParameter("MyParameter"); param.setDefaultValue("AWS CDK")
C#
var cfnBucket = (CfnBucket)template.GetResource("MyBucket"); var 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" }
TypeScript
// 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', });
JavaScript
// 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('NestedStack', { templateFile: 'my-nested-template.json', });
Python
# include nested stack when importing main stack main_template = cfn_inc.CfnInclude(self, "MainStack", template_file="main-template.json", load_nested_stacks=dict(NestedStack= cfn_inc.CfnIncludeProps(template_file="nested-template.json"))) # or add it some time after importing the main stack nested_template = main_template.load_nested_stack("NestedStack", template_file="nested-template.json")
Java
CfnInclude mainTemplate = CfnInclude.Builder.create(this, "MainStack") .templateFile("main-template.json") .loadNestedStacks(java.util.Map.of( // Map.of requires Java 9+ "NestedStack", CfnIncludeProps.builder() .templateFile("nested-template.json").build())) .build(); // or add it some time after importing the main stack IncludedNestedStack nestedTemplate = mainTemplate.loadNestedStack("NestedTemplate", CfnIncludeProps.builder() .templateFile("nested-template.json") .build());
C#
// include nested stack when importing main stack var mainTemplate = new cfnInc.CfnInclude(this, "MainStack", new cfnInc.CfnIncludeProps { TemplateFile = "main-template.json", LoadNestedStacks = new Dictionary<string, cfnInc.ICfnIncludeProps> { { "NestedStack", new cfnInc.CfnIncludeProps { TemplateFile = "nested-template.json" } } } }); // or add it some time after importing the main stack var nestedTemplate = mainTemplate.LoadNestedStack("NestedTemplate", new cfnInc.CfnIncludeProps { TemplateFile = 'nested-template.json' });

두 방법 중 하나를 사용하여 여러 개의 중첩된 스택을 가져올 수 있습니다. 기본 템플릿을 가져올 때 각 중첩된 스택의 리소스 이름과 해당 템플릿 파일 간의 매핑을 제공합니다. 이 매핑에는 여러 개의 항목이 포함될 수 있습니다. 초기 가져오기 이후에 이 작업을 수행하려면 각 중첩된 스택에 대해 loadNestedStack() 한 번씩 호출하십시오.

중첩된 스택을 가져온 후에는 기본 템플릿의 메서드를 사용하여 액세스할 수 있습니다. getNestedStack()

TypeScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
JavaScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
Python
nested_stack = main_template.get_nested_stack("NestedStack").stack
Java
NestedStack nestedStack = mainTemplate.getNestedStack("NestedStack").getStack();
C#
var nestedStack = mainTemplate.GetNestedStack("NestedStack").Stack;

getNestedStack()메서드는 인스턴스를 반환합니다. IncludedNestedStack 이 인스턴스에서는 예제와 같이 stack 속성을 통해 AWS CDK NestedStack인스턴스에 액세스할 수 있습니다. 또한 리소스 및 기타 AWS CloudFormation 요소를 로드할 수 있는 방법을 통해 includedTemplate 원본 AWS CloudFormation 템플릿 객체에 액세스할 수 있습니다.