v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔고 2023년 6월 1일에 지원을 종료했습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
태그와 AWS CDK
태그는 앱의 구문에 추가할 수 있는 정보용 키-값 요소입니다. AWS CDK 지정된 구문에 적용된 태그는 태그가 지정될 수 있는 모든 하위 구성요소에도 적용됩니다. 태그는 앱에서 합성된 AWS CloudFormation 템플릿에 포함되며 앱이 배포하는 AWS 리소스에 적용됩니다. 태그를 사용하여 다음과 같은 목적으로 리소스를 식별하고 분류할 수 있습니다.
-
관리 단순화
-
비용 할당
-
액세스 제어
-
사용자가 고안한 기타 모든 목적
리소스에 태그를 사용하는 방법에 대한 자세한 내용은 AWS 백서의 리소스 태그 지정 AWS
모범 사례를 참조하십시오.AWS
태그 사용
Tags
클래스에는 지정된 구문에 태그를 추가하거나 지정된 구문에서 태그를 제거할 수 있는 정적 메서드가 of()
포함되어 있습니다.
태깅은 를 사용하여 측면 및 AWS CDK 구현됩니다. Aspect는 지정된 범위 내의 모든 구문에 작업 (예: 태깅) 을 적용하는 방법입니다.
다음 예제에서는 값 값이 있는 태그 키를 구문에 적용합니다.
- TypeScript
-
Tags.of(myConstruct).add('key', 'value');
- JavaScript
-
Tags.of(myConstruct).add('key', 'value');
- Python
-
Tags.of(my_construct).add("key", "value")
- Java
-
Tags.of(myConstruct).add("key", "value");
- C#
-
Tags.Of(myConstruct).Add("key", "value");
- Go
-
awscdk.Tags_Of(myConstruct).Add(jsii.String("key"), jsii.String("value"), &awscdk.TagProps{})
다음 예제에서는 구문에서 태그 키를 삭제합니다.
- TypeScript
-
Tags.of(myConstruct).remove('key');
- JavaScript
-
Tags.of(myConstruct).remove('key');
- Python
-
Tags.of(my_construct).remove("key")
- Java
-
Tags.of(myConstruct).remove("key");
- C#
-
Tags.Of(myConstruct).Remove("key");
- Go
-
awscdk.Tags_Of(myConstruct).Remove(jsii.String("key"), &awscdk.TagProps{})
Stage
구문을 사용하는 경우 Stage
수준 또는 그 아래에 태그를 적용하십시오. 태그는 Stage
경계를 넘어서 적용되지 않습니다.
태그 우선순위
는 태그를 재귀적으로 AWS CDK 적용하고 제거합니다. 충돌이 발생할 경우 우선 순위가 가장 높은 태깅 작업이 우선합니다. (우선 순위는 선택적 priority
속성을 사용하여 설정됩니다.) 두 작업의 우선 순위가 같으면 구성 트리의 맨 아래에 가장 가까운 태깅 작업이 우선합니다. 기본적으로 태그 적용의 우선 순위는 100입니다 (우선 순위가 50인 AWS CloudFormation 리소스에 직접 추가된 태그 제외). 태그 제거의 기본 우선 순위는 200입니다.
다음은 우선 순위가 300인 태그를 구문에 적용합니다.
- TypeScript
-
Tags.of(myConstruct).add('key', 'value', {
priority: 300
});
- JavaScript
-
Tags.of(myConstruct).add('key', 'value', {
priority: 300
});
- Python
-
Tags.of(my_construct).add("key", "value", priority=300)
- Java
-
Tags.of(myConstruct).add("key", "value", TagProps.builder()
.priority(300).build());
- C#
-
Tags.Of(myConstruct).Add("key", "value", new TagProps { Priority = 300 });
- Go
-
awscdk.Tags_Of(myConstruct).Add(jsii.String("key"), jsii.String("value"), &awscdk.TagProps{
Priority: jsii.Number(300),
})
선택적 속성
태그는 태그가 리소스에 적용되거나 리소스에서 제거되는 방식을 세밀하게 조정할 수 있도록 지원합니다 properties
. 모든 속성은 선택 사항입니다.
applyToLaunchedInstances
(Python:apply_to_launched_instances
)
-
add () 에만 사용할 수 있습니다. 기본적으로 태그는 Auto Scaling 그룹에서 시작된 인스턴스에 적용됩니다. Auto Scaling 그룹에서 시작된 인스턴스를 무시하려면 이 속성을 false로 설정합니다.
includeResourceTypes
/excludeResourceTypes
(파이썬:include_resource_types
/exclude_resource_types
)
-
AWS CloudFormation 리소스 유형에 따라 리소스의 하위 집합에서만 태그를 조작하려면 이를 사용하십시오. 기본적으로 작업은 구성 하위 트리의 모든 리소스에 적용되지만 특정 리소스 유형을 포함하거나 제외하여 변경할 수 있습니다. 둘 다 지정된 경우 제외가 포함보다 우선합니다.
priority
-
이를 사용하여 다른 Tags.add()
및 Tags.remove()
작업과 관련하여 이 작업의 우선 순위를 설정할 수 있습니다. 값이 높을수록 낮은 값보다 우선합니다. 기본값은 추가 작업의 경우 100 ( AWS CloudFormation 리소스에 직접 적용된 태그의 경우 50), 제거 작업의 경우 200입니다.
다음 예제에서는 값 값과 우선 순위가 100인 태그 이름을 구성의 :XxxAWS: :Yyy 유형의 리소스에 적용합니다. Amazon EC2 Auto Scaling 그룹에서 시작된 인스턴스 또는 AWS: :Xxx: :Zzzz 유형의 리소스에는 태그를 적용하지 않습니다. (이는 임의적이지만 서로 다른 두 리소스 유형에 대한 자리 표시자입니다.) AWS CloudFormation
- TypeScript
-
Tags.of(myConstruct).add('tagname', 'value', {
applyToLaunchedInstances: false,
includeResourceTypes: ['AWS::Xxx::Yyy'],
excludeResourceTypes: ['AWS::Xxx::Zzz'],
priority: 100,
});
- JavaScript
-
Tags.of(myConstruct).add('tagname', 'value', {
applyToLaunchedInstances: false,
includeResourceTypes: ['AWS::Xxx::Yyy'],
excludeResourceTypes: ['AWS::Xxx::Zzz'],
priority: 100
});
- Python
-
Tags.of(my_construct).add("tagname", "value",
apply_to_launched_instances=False,
include_resource_types=["AWS::Xxx::Yyy"],
exclude_resource_types=["AWS::Xxx::Zzz"],
priority=100)
- Java
-
Tags.of(myConstruct).add("tagname", "value", TagProps.builder()
.applyToLaunchedInstances(false)
.includeResourceTypes(Arrays.asList("AWS::Xxx::Yyy"))
.excludeResourceTypes(Arrays.asList("AWS::Xxx::Zzz"))
.priority(100).build());
- C#
-
Tags.Of(myConstruct).Add("tagname", "value", new TagProps
{
ApplyToLaunchedInstances = false,
IncludeResourceTypes = ["AWS::Xxx::Yyy"],
ExcludeResourceTypes = ["AWS::Xxx::Zzz"],
Priority = 100
});
- Go
-
awscdk.Tags_Of(myConstruct).Add(jsii.String("tagname"), jsii.String("value"), &awscdk.TagProps{
ApplyToLaunchedInstances: jsii.Bool(false),
IncludeResourceTypes: &[]*string{jsii.String("AWS::Xxx:Yyy")},
ExcludeResourceTypes: &[]*string{jsii.String("AWS::Xxx:Zzz")},
Priority: jsii.Number(100),
})
다음 예제에서는 우선 순위가 200인 태그 이름을 생성의: :Xxx AWS: :Yyyy 유형의 리소스에서는 제거하지만, :Xxx: :Zzzz 유형의 리소스에서는 제거하지 않습니다. AWS
- TypeScript
-
Tags.of(myConstruct).remove('tagname', {
includeResourceTypes: ['AWS::Xxx::Yyy'],
excludeResourceTypes: ['AWS::Xxx::Zzz'],
priority: 200,
});
- JavaScript
-
Tags.of(myConstruct).remove('tagname', {
includeResourceTypes: ['AWS::Xxx::Yyy'],
excludeResourceTypes: ['AWS::Xxx::Zzz'],
priority: 200
});
- Python
-
Tags.of(my_construct).remove("tagname",
include_resource_types=["AWS::Xxx::Yyy"],
exclude_resource_types=["AWS::Xxx::Zzz"],
priority=200,)
- Java
-
Tags.of((myConstruct).remove("tagname", TagProps.builder()
.includeResourceTypes(Arrays.asList("AWS::Xxx::Yyy"))
.excludeResourceTypes(Arrays.asList("AWS::Xxx::Zzz"))
.priority(100).build());
- C#
-
Tags.Of(myConstruct).Remove("tagname", new TagProps
{
IncludeResourceTypes = ["AWS::Xxx::Yyy"],
ExcludeResourceTypes = ["AWS::Xxx::Zzz"],
Priority = 100
});
- Go
-
awscdk.Tags_Of(myConstruct).Remove(jsii.String("tagname"), &awscdk.TagProps{
IncludeResourceTypes: &[]*string{jsii.String("AWS::Xxx:Yyy")},
ExcludeResourceTypes: &[]*string{jsii.String("AWS::Xxx:Zzz")},
Priority: jsii.Number(200),
})
예
다음 예제에서는 이름이 지정된 리소스 내에 생성된 모든 리소스에 값이 StackTypeTheBest있는 태그 키를 추가합니다. Stack
MarketingSystem
그런 다음 Amazon EC2 VPC 서브넷을 제외한 모든 리소스에서 다시 제거합니다. 결과적으로 서브넷에만 태그가 적용됩니다.
- TypeScript
-
import { App, Stack, Tags } from 'aws-cdk-lib';
const app = new App();
const theBestStack = new Stack(app, 'MarketingSystem');
// Add a tag to all constructs in the stack
Tags.of(theBestStack).add('StackType', 'TheBest');
// Remove the tag from all resources except subnet resources
Tags.of(theBestStack).remove('StackType', {
excludeResourceTypes: ['AWS::EC2::Subnet']
});
- JavaScript
-
const { App, Stack, Tags } = require('aws-cdk-lib');
const app = new App();
const theBestStack = new Stack(app, 'MarketingSystem');
// Add a tag to all constructs in the stack
Tags.of(theBestStack).add('StackType', 'TheBest');
// Remove the tag from all resources except subnet resources
Tags.of(theBestStack).remove('StackType', {
excludeResourceTypes: ['AWS::EC2::Subnet']
});
- Python
-
from aws_cdk import App, Stack, Tags
app = App();
the_best_stack = Stack(app, 'MarketingSystem')
# Add a tag to all constructs in the stack
Tags.of(the_best_stack).add("StackType", "TheBest")
# Remove the tag from all resources except subnet resources
Tags.of(the_best_stack).remove("StackType",
exclude_resource_types=["AWS::EC2::Subnet"])
- Java
-
import software.amazon.awscdk.App;
import software.amazon.awscdk.Tags;
// Add a tag to all constructs in the stack
Tags.of(theBestStack).add("StackType", "TheBest");
// Remove the tag from all resources except subnet resources
Tags.of(theBestStack).remove("StackType", TagProps.builder()
.excludeResourceTypes(Arrays.asList("AWS::EC2::Subnet"))
.build());
- C#
-
using Amazon.CDK;
var app = new App();
var theBestStack = new Stack(app, 'MarketingSystem');
// Add a tag to all constructs in the stack
Tags.Of(theBestStack).Add("StackType", "TheBest");
// Remove the tag from all resources except subnet resources
Tags.Of(theBestStack).Remove("StackType", new TagProps
{
ExcludeResourceTypes = ["AWS::EC2::Subnet"]
});
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
app := awscdk.NewApp(nil)
theBestStack := awscdk.NewStack(app, jsii.String("MarketingSystem"), &awscdk.StackProps{})
// Add a tag to all constructs in the stack
awscdk.Tags_Of(theBestStack).Add(jsii.String("StackType"), jsii.String("TheBest"), &awscdk.TagProps{})
// Remove the tag from all resources except subnet resources
awscdk.Tags_Of(theBestStack).Add(jsii.String("StackType"), jsii.String("TheBest"), &awscdk.TagProps{
ExcludeResourceTypes: &[]*string{jsii.String("AWS::EC2::Subnet")},
})
다음 코드에서도 동일한 결과를 얻을 수 있습니다. 어떤 접근 방식 (포함 또는 제외) 이 의도를 더 명확하게 해주는지 생각해 보세요.
- TypeScript
-
Tags.of(theBestStack).add('StackType', 'TheBest',
{ includeResourceTypes: ['AWS::EC2::Subnet']});
- JavaScript
-
Tags.of(theBestStack).add('StackType', 'TheBest',
{ includeResourceTypes: ['AWS::EC2::Subnet']});
- Python
-
Tags.of(the_best_stack).add("StackType", "TheBest",
include_resource_types=["AWS::EC2::Subnet"])
- Java
-
Tags.of(theBestStack).add("StackType", "TheBest", TagProps.builder()
.includeResourceTypes(Arrays.asList("AWS::EC2::Subnet"))
.build());
- C#
-
Tags.Of(theBestStack).Add("StackType", "TheBest", new TagProps {
IncludeResourceTypes = ["AWS::EC2::Subnet"]
});
- Go
-
awscdk.Tags_Of(theBestStack).Add(jsii.String("StackType"), jsii.String("TheBest"), &awscdk.TagProps{
IncludeResourceTypes: &[]*string{jsii.String("AWS::EC2::Subnet")},
})
단일 구문에 태그 지정하기
Tags.of(scope).add(key, value)
에서 구문에 태그를 추가하는 표준 방법입니다. AWS CDK주어진 범위 내에서 태그 지정 가능한 모든 리소스에 재귀적으로 태그를 지정하는 트리 워킹 동작은 거의 항상 원하는 방식입니다. 하지만 임의의 특정 구문 (또는 구문) 에 태그를 지정해야 하는 경우가 있습니다.
이러한 경우 중 하나는 태그가 지정되는 구문의 일부 속성에서 값이 파생된 태그를 적용하는 것입니다. 표준 태깅 접근 방식은 범위 내 모든 일치하는 리소스에 동일한 키와 값을 재귀적으로 적용합니다. 하지만 여기서는 태그가 지정된 구조마다 값이 다를 수 있습니다.
태그는 Aspect를 사용하여 구현되며 는 사용하여 Tags.of(scope) 지정한 범위 내에서 각 구문에 대해 태그의 visit() 메서드를 CDK 호출합니다. Tag.visit()
직접 호출하여 단일 구문에 태그를 적용할 수 있습니다.
- TypeScript
-
new cdk.Tag(key, value).visit(scope);
- JavaScript
-
new cdk.Tag(key, value).visit(scope);
- Python
-
cdk.Tag(key, value).visit(scope)
- Java
-
Tag.Builder.create(key, value).build().visit(scope);
- C#
-
new Tag(key, value).Visit(scope);
- Go
-
awscdk.NewTag(key, value, &awscdk.TagProps{}).Visit(scope)
범위 내의 모든 구문에 태그를 지정할 수 있지만 태그의 값은 각 구문의 속성에서 파생되도록 할 수 있습니다. 이렇게 하려면 이전 예제와 같이 애스펙트를 작성하고 애스펙트의 visit()
메서드에 태그를 적용하세요. 그런 다음 를 사용하여 Aspects.of(scope).add(aspect)
원하는 범위에 애스펙트를 추가합니다.
다음 예제에서는 리소스 경로가 포함된 스택의 각 리소스에 태그를 적용합니다.
- TypeScript
-
class PathTagger implements cdk.IAspect {
visit(node: IConstruct) {
new cdk.Tag("aws-cdk-path", node.node.path).visit(node);
}
}
stack = new MyStack(app);
cdk.Aspects.of(stack).add(new PathTagger())
- JavaScript
-
class PathTagger {
visit(node) {
new cdk.Tag("aws-cdk-path", node.node.path).visit(node);
}
}
stack = new MyStack(app);
cdk.Aspects.of(stack).add(new PathTagger())
- Python
-
@jsii.implements(cdk.IAspect)
class PathTagger:
def visit(self, node: IConstruct):
cdk.Tag("aws-cdk-path", node.node.path).visit(node)
stack = MyStack(app)
cdk.Aspects.of(stack).add(PathTagger())
- Java
-
final class PathTagger implements IAspect {
public void visit(IConstruct node) {
Tag.Builder.create("aws-cdk-path", node.getNode().getPath()).build().visit(node);
}
}
stack stack = new MyStack(app);
Aspects.of(stack).add(new PathTagger());
- C#
-
public class PathTagger : IAspect
{
public void Visit(IConstruct node)
{
new Tag("aws-cdk-path", node.Node.Path).Visit(node);
}
}
var stack = new MyStack(app);
Aspects.Of(stack).Add(new PathTagger);
우선 순위, 리소스 유형 등을 포함한 조건부 태깅 로직이 클래스에 내장되어 있습니다. Tag
임의의 리소스에 태그를 적용할 때 이러한 기능을 사용할 수 있습니다. 조건이 충족되지 않으면 태그가 적용되지 않습니다. 또한 Tag
클래스는 태그가 가능한 리소스에만 태그를 지정하므로 태그를 적용하기 전에 구문에 태깅이 가능한지 테스트할 필요가 없습니다.