Problem
Currently, adding AWS resource tags to platform-managed resources requires:
- kro RGDs: Declaring each tag key individually in SimpleSchema and propagating one by one to each resource template
- CDK stack: Hardcoding tag values in the CDK code
- No single source of truth — tags must be duplicated across layers
This is brittle and doesn't scale for customers who need:
- SpringClean protection (
auto-delete: no)
- Cost allocation (
cost-center, team, project)
- Compliance tags (
data-classification, environment)
Proposed Solution
Layer 1: CDK (infrastructure resources)
A platformTags map in config.local.yaml (or cdk.json context) that gets applied to all CDK resources via Tags.of(stack).add():
# config.local.yaml
platformTags:
auto-delete: "no"
cost-center: "platform-engineering"
managed-by: "peeks"
Layer 2: kro RGDs (Kubernetes-managed AWS resources)
A generic spec.awsTags field (map[string]string) in RGD schemas that gets merged/spread into the tags section of all AWS resources:
spec:
awsTags:
auto-delete: "no"
cost-center: "1234"
Layer 3: Single source of truth
Ideally, config.local.yaml defines tags once, and they propagate to:
- CDK via
Tags.of()
- kro RGDs via instance values (ArgoCD injects from config)
- Helm charts via global values (for pod labels)
Current PR
PR #753 (feat(kro): add protectFromDeletion parameter) is a partial workaround that hardcodes a single auto-delete tag. It will be closed in favor of this more generic approach.
Tasks
References
Problem
Currently, adding AWS resource tags to platform-managed resources requires:
This is brittle and doesn't scale for customers who need:
auto-delete: no)cost-center,team,project)data-classification,environment)Proposed Solution
Layer 1: CDK (infrastructure resources)
A
platformTagsmap inconfig.local.yaml(orcdk.jsoncontext) that gets applied to all CDK resources viaTags.of(stack).add():Layer 2: kro RGDs (Kubernetes-managed AWS resources)
A generic
spec.awsTagsfield (map[string]string) in RGD schemas that gets merged/spread into thetagssection of all AWS resources:Layer 3: Single source of truth
Ideally,
config.local.yamldefines tags once, and they propagate to:Tags.of()Current PR
PR #753 (
feat(kro): add protectFromDeletion parameter) is a partial workaround that hardcodes a singleauto-deletetag. It will be closed in favor of this more generic approach.Tasks
config.local.yamlawsTagsfield (if CEL supports it) or per-tag schema (if not)References