これは AWS CDK v2 デベロッパーガイドです。古い CDKv1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
タグと AWS CDK
タグは、 AWS CDK アプリのコンストラクトに追加できる情報キーバリュー要素です。特定のコンストラクトに適用されるタグは、そのタグ付け可能なすべての子にも適用されます。タグはアプリケーションから合成された AWS CloudFormation テンプレートに含まれ、デプロイする AWS リソースに適用されます。タグを使用して、以下の目的でリソースを識別および分類できます。
-
管理の簡素化
-
コスト配分
-
アクセスコントロール
-
ユーザーが考案したその他の目的
タグの使用
Tags
クラスには静的メソッド が含まれておりof()
、このメソッドを使用して、指定したコンストラクトにタグを追加したり、そこからタグを削除したりできます。
タグ付けは を使用して実装されます側面と AWS CDK。アスペクトとは、特定のスコープ内のすべてのコンストラクトにオペレーション (タグ付けなど) を適用する方法です。
次の例では、値 を持つタグキーを コンストラクトに適用します。
- 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
プロパティを使用して設定されます。) 2 つのオペレーションの優先順位が同じ場合、コンストラクトツリーの下部に最も近いタグ付けオペレーションが優先されます。デフォルトでは、タグの適用の優先度は 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 は include よりも優先されます。
priority
-
これを使用して、他の Tags.add()
および オペレーションに関するこのTags.remove()
オペレーションの優先度を設定します。値が大きいほど、小さい値よりも優先されます。デフォルトは、追加オペレーションの場合は 100 ( AWS CloudFormation リソースに直接適用されるタグの場合は 50)、削除オペレーションの場合は 200 です。
次の例では、タグ tagname に値 を、優先度 100 を コンストラクトの AWS::Xxx::Yyy タイプのリソースに適用します。Amazon EC2 Auto Scaling グループで起動されたインスタンスや、タイプ AWS::Xxx::Zzz のリソースにはタグは適用されません。(これらは 2 つの任意の異なる 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 EC2VPCサブネットを除くすべてのリソースから再度削除されます。その結果、タグが適用されたのはサブネットのみです。
- 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。そのツリーウォーキング動作は、指定されたスコープ内のすべてのタグ付け可能なリソースを再帰的にタグ付けします。ただし、特定の任意のコンストラクト (またはコンストラクト) にタグ付けする必要がある場合があります。
このようなケースの 1 つは、タグ付けされるコンストラクトのプロパティから値が導出されるタグの適用です。標準のタグ付けアプローチは、スコープ内のすべての一致するリソースに同じキーと値を再帰的に適用します。ただし、ここでは、タグ付けされたコンストラクトごとに値が異なる場合があります。
タグは側面 を使用して実装され、 は を使用して指定したスコープで各コンストラクトのタグの visit()
メソッドをCDK呼び出しますTags.of(scope)
。Tag.visit()
を直接呼び出して、タグを 1 つのコンストラクトに適用できます。
- 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
クラスはタグ付け可能なリソースのみをタグ付けするため、タグを適用する前にコンストラクトにタグ付けできるかどうかをテストする必要はありません。