태그 및 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원을 종료했습니다.

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

태그 및 AWS CDK

태그는 AWS CDK 앱의 구문에 추가할 수 있는 정보 키-값 요소입니다. 지정된 구문에 적용된 태그는 태그를 지정할 수 있는 모든 자식에도 적용됩니다. 태그는 앱에서 합성된 AWS CloudFormation 템플릿에 포함되며 배포하는 AWS 리소스에 적용됩니다. 태그를 사용하여 다음과 같은 목적으로 리소스를 식별하고 분류할 수 있습니다.

  • 관리 간소화

  • 비용 할당

  • 액세스 제어

  • 사용자가 고안한 기타 모든 목적

작은 정보

AWS 리소스에 태그를 사용하는 방법에 대한 자세한 내용은 AWS 백서리소스 태그 지정 AWS 모범 사례를 참조하세요.

태그 사용

Tags 클래스에는 지정된 구문에 태그를 추가하거나 제거할 수 있는 정적 메서드인 of()가 포함되어 있습니다.

  • Tags.of(SCOPE).add()는 지정된 구문과 그 모든 자식에 새 태그를 적용합니다.

  • Tags.of(SCOPE).remove()는 지정된 구문과 그 자식 구문에서 태그를 제거합니다. 여기에는 자식 구문이 자신에게 적용했을 수 있는 태그도 포함됩니다.

참고

태깅은 측면 및 AWS CDK를 사용하여 구현됩니다. 측면은 지정된 범위의 모든 구문에 태그 지정 등의 작업을 적용하는 방법입니다.

다음 예에서는 구문에 값이 valuekey 태그를 적용합니다.

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{})

다음 예에서는 구문에서 key 태그를 삭제합니다.

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(Python: include_resource_types/exclude_resource_types)

리소스 AWS CloudFormation 유형에 따라 리소스 하위 집합에서만 태그를 조작하는 데 사용합니다. 기본적으로 작업은 구문 하위 트리의 모든 리소스에 적용되지만 특정 리소스 유형을 포함하거나 제외하여 변경할 수 있습니다. Exclude는 둘 다 지정된 경우 포함보다 우선합니다.

priority

이를 사용하여 다른 Tags.add()Tags.remove() 작업과 관련하여 이 작업의 우선순위를 설정합니다. 값이 높을수록 낮은 값보다 우선합니다. 기본값은 추가 작업의 경우 100( AWS CloudFormation 리소스에 직접 적용된 태그의 경우 50), 제거 작업의 경우 200입니다.

다음 예제에서는 및 우선 순위 100이 있는 태그 태그 이름을 구문의 유형 AWS::Xxx::Yyy 리소스에 적용합니다. Amazon EC2 Auto Scaling 그룹에서 시작된 인스턴스 또는 AWS::Xxx::Zzz 유형의 리소스에는 태그를 적용하지 않습니다. (이는 임의적이지만 서로 다른 두 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), })

다음 예제에서는 구성의 AWS::Xxx::Yyy 유형의 리소스에서 우선 순위가 200인 태그 태그 이름을 제거하지만 AWS::Xxx::Zzz 유형의 리소스에서는 제거하지 않습니다.

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), })

예제

다음 예제에서는 이름이 Stack인 내에서 생성된 TheBest 리소스에 값이 StackType 인 태그 키를 추가합니다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에서 구문에 태그를 추가하는 표준 방법입니다. 지정된 범위에 있는 모든 태그 지정 가능 리소스에 반복적으로 태그를 지정하는 트리 워킹 동작은 거의 항상 원하는 것입니다. 그러나 하나 이상의 특정 임의 구문에 태그를 지정해야 하는 경우가 있습니다.

이러한 경우 중 하나는 태그가 지정되는 구문의 일부 속성에서 값이 파생된 태그를 적용하는 것입니다. 표준 태깅 접근 방식은 범위의 모든 일치하는 리소스에 동일한 키와 값을 반복적으로 적용합니다. 그러나 여기에서는 태그가 지정된 구문마다 값이 다를 수 있습니다.

태그는 측면을 사용하여 구현되며,는를 사용하여 지정한 범위에서 각 구문에 대한 태그의 visit() 메서드를 CDK 호출합니다Tags.of(scope). 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 클래스는 태그를 지정할 수 있는 리소스에만 태그를 지정하므로 태그를 적용하기 전에 구문에 태그를 지정할 수 있는지 테스트할 필요가 없습니다.