How to add a tag to an AWS-CDK specific construct or even better one tag definition to all ressources created within the stack?
Because you'll likely want to add more than one Tag to a construct, its handy to pass an object of tags. You can use aspects in cdk to descend nodes looking for node of your type and applying whatever you want to apply to said node. The following example adds tags.
export class TagAspect implements cdk.IAspect {
private readonly tags: Object;
constructor(tags: Object) {
this.tags = tags;
}
public visit(node: cdk.IConstruct): void {
if (node instanceof cdk.Stack) {
Object.entries(this.tags).forEach( ([key, value]) => {
cdk.Tag.add(node,key,value);
});
}}}
Then in the Stack you want to apply an aspect to run
this.node.applyAspect(new TagAspect({"tag1":"mytag1","tag2":"another tag","tag3":"andanother"}));
Using the Java
SDK:
public class CdkInitClusterApp {
public static void main(final String[] args) {
final App app = new App();
final CdkInitClusterStack cdkInitClusterStack = new CdkInitClusterStack(app, "CdkInitClusterStack");
Tag.add(cdkInitClusterStack, "Project", "Value");
app.synth();
}
}
Then recreate the jar
mvn clean compile package
And run the cdk diff
for verify the changes, the output will be similar to the following one:
(base) [alessiosavi@localhost cdk-init-cluster]$ cdk diff
CdkInitClusterStack
Resources
[~] AWS::DynamoDB::Table cdk-test-table cdktesttableB0274F47
└─ [+] Tags
└─ [{"Key":"Project","Value":"Value"}]
According to aws-cdk doc you can add a tag to all constructs/ressources. Tags will inherits to constructs within same "tree". That's pretty cool.
Example using aws-cdk based on java:
MyStack stack = new MyStack(app, "nameOfStack");
Tag.add(stack, "tag_foo", "tag_foo");
AWS-Doc CDK Tagging
AWS CDK Reference: Tag
Tags can be applied to any construct. Tags are inherited, based on the scope. If you tag construct A, and A contains construct B, construct B inherits the tag.
Example from aws-cdk doc:
import { App, Stack, Tag } from require('@aws-cdk/core');
const app = new App();
const theBestStack = new Stack(app, 'MarketingSystem');
// Add a tag to all constructs in the stack
Tag.add(theBestStack, 'StackType', 'TheBest');
The above answers use the deprecated syntax.
Newer version of tagging the whole App:
const app = new cdk.App();
new SomeStack(app, 'SomeStack');
Tags.of(app).add("app", "my-app-name-here");
You could also tag individual stacks only:
const app = new cdk.App();
const stack = new SomeStack(app, 'SomeStack');
Tags.of(stack).add("stack-name", "SomeStack");
Or individual Constructs:
const usersTable = new dynamodb.Table(this, 'Users');
Tags.of(usersTable).add("owner", "team-andromeda");
Tags will apply to sub-Constructs hierarchically.