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 생성하도록 하세요. 이렇게 하면 이름 충돌 없이 스택에서 구문을 여러 번 사용할 수 있습니다. 이렇게 하려면 템플릿을 가져올 false
때 preserveLogicalIds
속성을 로 설정해야 합니다. 다음은 그 예제입니다.
- 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");
이 예제에서는 cfnBucket
이 aws-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 템플릿 객체에 액세스할 수 있습니다.