

これは AWS CDK v2 デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# タグと AWS CDK
<a name="tagging"></a>

タグは、AWS CDK アプリのコンストラクトに追加できる情報を含んだキーと値の要素です。特定のコンストラクトに適用されるタグは、タグ付け可能なすべての子にも適用されます。タグは、アプリから合成された AWS CloudFormation テンプレートに含まれ、デプロイされる AWS リソースに適用されます。タグを使用し、次の用途でリソースを識別および分類できます。
+ 管理の簡素化
+ コスト配分
+ アクセスコントロール
+ 考案したその他の用途

**ヒント**  
AWS リソースでタグを使用する方法の詳細については、「*AWS ホワイトペーパー*」の「[AWS リソースのタグ付けのベストプラクティス](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)」を参照してください。

## タグの使用
<a name="tagging-use"></a>

[タグ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Tags.html)クラスには静的メソッドの `of()` が含まれており、これを使用して指定されたコンストラクトにタグを追加したり、タグを削除したりすることができます。
+  [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Tags.html#addkey-value-props](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Tags.html#addkey-value-props) は、指定されたコンストラクトおよびそのすべての子に新しいタグを適用します。
+  [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Tags.html#removekey-props](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Tags.html#removekey-props) は、子コンストラクトがそれ自体に適用したタグなど、特定のコンストラクトおよびその子からタグを削除します。

**注記**  
タグ付けは、[アスペクトと AWS CDK を使用して実装されます](aspects.md)。アスペクトは、特定のスコープのすべてのコンストラクトにオペレーション (タグ付けなど) を適用する方法です。

次の例では、**値**を持つタグ**キー**をコンストラクトに適用します。

**Example**  

```
Tags.of(myConstruct).add('key', 'value');
```

```
Tags.of(myConstruct).add('key', 'value');
```

```
Tags.of(my_construct).add("key", "value")
```

```
Tags.of(myConstruct).add("key", "value");
```

```
Tags.Of(myConstruct).Add("key", "value");
```

```
awscdk.Tags_Of(myConstruct).Add(jsii.String("key"), jsii.String("value"), &awscdk.TagProps{})
```

次の例では、コンストラクトからタグ**キー**を削除します。

**Example**  

```
Tags.of(myConstruct).remove('key');
```

```
Tags.of(myConstruct).remove('key');
```

```
Tags.of(my_construct).remove("key")
```

```
Tags.of(myConstruct).remove("key");
```

```
Tags.Of(myConstruct).Remove("key");
```

```
awscdk.Tags_Of(myConstruct).Remove(jsii.String("key"), &awscdk.TagProps{})
```

`Stage` コンストラクトを使用している場合、タグを `Stage` レベル以下で適用します。タグは `Stage` 境界を越えて適用されません。

## タグの優先順位
<a name="tagging-priorities"></a>

AWS CDK はタグを再帰的に適用および削除します。競合がある場合、優先順位が最も高いタグ付けオペレーションが優先されます。(優先順位はオプションの `priority` プロパティを使用して設定されます) 2 つのオペレーションの優先順位が同じである場合、コンストラクトツリーの下部に最も近いタグ付けオペレーションが優先されます。デフォルトでは、タグ適用の優先順位は 100 です (優先順位が 50 の AWS CloudFormation リソースに直接追加されたタグを除く)。タグ削除のデフォルトの優先順位は 200 です。

次の内容は、優先順位が 300 のタグをコンストラクトに適用します。

**Example**  

```
Tags.of(myConstruct).add('key', 'value', {
  priority: 300
});
```

```
Tags.of(myConstruct).add('key', 'value', {
  priority: 300
});
```

```
Tags.of(my_construct).add("key", "value", priority=300)
```

```
Tags.of(myConstruct).add("key", "value", TagProps.builder()
        .priority(300).build());
```

```
Tags.Of(myConstruct).Add("key", "value", new TagProps { Priority = 300 });
```

```
awscdk.Tags_Of(myConstruct).Add(jsii.String("key"), jsii.String("value"), &awscdk.TagProps{
  Priority: jsii.Number(300),
})
```

## オプションプロパティ
<a name="tagging-props"></a>

タグは、リソースへのタグの適用方法、あるいはリソースからのタグの削除方法を微調整する [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.TagProps.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.TagProps.html) をサポートします。すべてのプロパティはオプションです。

 `applyToLaunchedInstances`/ (Python:`apply_to_launched_instances` /)  
add() にのみ利用できます。デフォルトでは、タグは Auto Scaling グループで起動されたインスタンスに適用されます。このプロパティを **false** に設定し、Auto Scaling グループで起動されたインスタンスを無視します。

 `includeResourceTypes`/`excludeResourceTypes` (Python: `include_resource_types`/`exclude_resource_types`)  
AWS CloudFormation リソースタイプに基づき、これらを使用してリソースのサブセットにのみタグを操作します。デフォルトでは、オペレーションはコンストラクトサブツリーのすべてのリソースに適用されますが、特定のリソースタイプを含めるか除外するかによって変更できます。exclude および include の両方が指定された場合、exclude が優先されます。

 `priority`   
これを使用し、他の `Tags.add()` および `Tags.remove()` オペレーションに関するこのオペレーションの優先順位を設定します。大きい値は小さい値よりも優先されます。デフォルトは、追加オペレーションの場合は 100 (AWS CloudFormation リソースに直接適用されるタグの場合は 50)、削除オペレーションの場合は 200 です。

次の例では、コンストラクトの **AWS::Xxx::Yyy** タイプのリソースに、値が **value** で優先度が **100** のタグ **tagname** を適用します。Amazon EC2 Auto Scaling グループで起動されたインスタンスや、**AWS::Xxx::Zzz** 型のリソースにはタグを適用しません。(これらは 2 つの任意で異なる AWS CloudFormation リソースタイプのプレースホルダーです)

**Example**  

```
Tags.of(myConstruct).add('tagname', 'value', {
  applyToLaunchedInstances: false,
  includeResourceTypes: ['AWS::Xxx::Yyy'],
  excludeResourceTypes: ['AWS::Xxx::Zzz'],
  priority: 100,
});
```

```
Tags.of(myConstruct).add('tagname', 'value', {
  applyToLaunchedInstances: false,
  includeResourceTypes: ['AWS::Xxx::Yyy'],
  excludeResourceTypes: ['AWS::Xxx::Zzz'],
  priority: 100
});
```

```
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)
```

```
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());
```

```
Tags.Of(myConstruct).Add("tagname", "value", new TagProps
{
    ApplyToLaunchedInstances = false,
    IncludeResourceTypes = ["AWS::Xxx::Yyy"],
    ExcludeResourceTypes = ["AWS::Xxx::Zzz"],
    Priority = 100
});
```

```
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** のタグ **tagname** をコンストラクトの **AWS::Xxx::Yyy** 型のリソースから削除しますが、**AWS::Xxx::Zzz** 型のリソースからは削除しません。

**Example**  

```
Tags.of(myConstruct).remove('tagname', {
  includeResourceTypes: ['AWS::Xxx::Yyy'],
  excludeResourceTypes: ['AWS::Xxx::Zzz'],
  priority: 200,
});
```

```
Tags.of(myConstruct).remove('tagname', {
  includeResourceTypes: ['AWS::Xxx::Yyy'],
  excludeResourceTypes: ['AWS::Xxx::Zzz'],
  priority: 200
});
```

```
Tags.of(my_construct).remove("tagname",
    include_resource_types=["AWS::Xxx::Yyy"],
    exclude_resource_types=["AWS::Xxx::Zzz"],
    priority=200,)
```

```
Tags.of((myConstruct).remove("tagname", TagProps.builder()
        .includeResourceTypes(Arrays.asList("AWS::Xxx::Yyy"))
        .excludeResourceTypes(Arrays.asList("AWS::Xxx::Zzz"))
        .priority(100).build());
        )
```

```
Tags.Of(myConstruct).Remove("tagname", new TagProps
{
    IncludeResourceTypes = ["AWS::Xxx::Yyy"],
    ExcludeResourceTypes = ["AWS::Xxx::Zzz"],
    Priority = 100
});
```

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

## 例
<a name="tagging-example"></a>

次の例では、`MarketingSystem` という名前で `Stack` 内に作成されたすべてのリソースに、**TheBest** の値をもつ **StackType** のタグキーを追加します。次に、Amazon EC2 VPC サブネットを除くすべてのリソースから再度削除します。その結果、サブネットのみにタグが適用されます。

**Example**  

```
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']
});
```

```
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']
});
```

```
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"])
```

```
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());
```

```
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"]
});
```

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

次のコードは同じ結果を出します。どのアプローチ (包含または除外) が意図をより明確にするか検討します。

**Example**  

```
Tags.of(theBestStack).add('StackType', 'TheBest',
  { includeResourceTypes: ['AWS::EC2::Subnet']});
```

```
Tags.of(theBestStack).add('StackType', 'TheBest',
  { includeResourceTypes: ['AWS::EC2::Subnet']});
```

```
Tags.of(the_best_stack).add("StackType", "TheBest",
    include_resource_types=["AWS::EC2::Subnet"])
```

```
Tags.of(theBestStack).add("StackType", "TheBest", TagProps.builder()
        .includeResourceTypes(Arrays.asList("AWS::EC2::Subnet"))
        .build());
```

```
Tags.Of(theBestStack).Add("StackType", "TheBest", new TagProps {
    IncludeResourceTypes = ["AWS::EC2::Subnet"]
});
```

```
awscdk.Tags_Of(theBestStack).Add(jsii.String("StackType"), jsii.String("TheBest"), &awscdk.TagProps{
  IncludeResourceTypes: &[]*string{jsii.String("AWS::EC2::Subnet")},
})
```

## 1 つのコンストラクトのタグ付け
<a name="tagging-single"></a>

 `Tags.of(scope).add(key, value)` は、AWS CDK のコンストラクトにタグを追加する標準的な方法です。そのツリーウォーキング動作は、特定のスコープですべてのタグ付け可能なリソースを再帰的にタグ付けし、ほぼ常に必要な動作です。ただし、特定の任意のコンストラクト (または複数のコンストラクト) にタグ付けが必要な場合があります。

このようなケースの 1 つには、タグ付けされるコンストラクトの一部のプロパティから値が導出されるタグが適用されます。標準のタグ付けアプローチは、スコープのすべての一致するリソースに同じキーおよび値を再帰的に適用します。ただし、こちらではタグ付けされたコンストラクトごとに値が異なる場合があります。

タグは[アスペクト](aspects.md)を使用して実装され、CDK は `Tags.of(scope)` を使用して指定したスコープで各コンストラクトにタグの `visit()` メソッドを呼び出します。`Tag.visit()` を直接を呼び出し、タグを 1 つのコンストラクトに適用できます。

**Example**  

```
new cdk.Tag(key, value).visit(scope);
```

```
new cdk.Tag(key, value).visit(scope);
```

```
cdk.Tag(key, value).visit(scope)
```

```
Tag.Builder.create(key, value).build().visit(scope);
```

```
new Tag(key, value).Visit(scope);
```

```
awscdk.NewTag(key, value, &awscdk.TagProps{}).Visit(scope)
```

スコープのすべてのコンストラクトにタグ付けすることはできますが、タグの値が各コンストラクトのプロパティから導出させます。これを行うには、前の例で示すように、アスペクトを記述してアスペクトの `visit()` メソッドにタグを適用します。次に、`Aspects.of(scope).add(aspect)` を使用して目的のスコープにアスペクトを追加します。

次の例では、リソースのパスを含むスタックの各リソースにタグを適用します。

**Example**  

```
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())
```

```
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())
```

```
@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())
```

```
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());
```

```
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` クラスはタグ付け可能なリソースのみをタグ付けするため、タグを適用する前にコンストラクトがタグ付け可能であるかどうかをテストする必要はありません。