CreateStack accepts Tags.member.N, and substrate drops them. CFNStackState has no
Tags field at all, so the tags are not recorded on the stack, not reported by
DescribeStacks, and not propagated to the resources the stack creates.
Both halves are missing and both are observable:
- The stack's own tags. AWS's
CreateStack documents up to 50 Tag members, and
DescribeStacks reports them back. A caller who tags a stack and reads it back gets an
empty list here.
- Propagation. AWS propagates a stack's tags to the resources it creates, for the
resource types that support tagging, so a policy or a cost report keyed on a stack tag
reaches the resources. Nothing propagates here.
#746 delivered the other mechanism — CloudFormation's own
aws:cloudformation:stack-name/stack-id/logical-id stamp, which is CFN's bookkeeping and
not caller-supplied. That is why this is a separate issue rather than the rest of #746: the
stamp needed no new state, and this needs a Tags field on the stack record, a
DescribeStacks member, and a decision about what happens to a propagated tag when the
caller later removes it from the stack.
The seam #746 built is reusable: StackDeployer.stampCFNResourceTags is called from the one
place that holds the physical ID and the stack context, so propagation is more tags through
the same call — but only for the resource types that path can resolve (EC2 today, see the
sibling issue on widening it).
Acceptance criteria
Carved out of #746 (v0.109.0).
CreateStackacceptsTags.member.N, and substrate drops them.CFNStackStatehas noTagsfield at all, so the tags are not recorded on the stack, not reported byDescribeStacks, and not propagated to the resources the stack creates.Both halves are missing and both are observable:
CreateStackdocuments up to 50Tagmembers, andDescribeStacksreports them back. A caller who tags a stack and reads it back gets anempty list here.
resource types that support tagging, so a policy or a cost report keyed on a stack tag
reaches the resources. Nothing propagates here.
#746 delivered the other mechanism — CloudFormation's own
aws:cloudformation:stack-name/stack-id/logical-idstamp, which is CFN's bookkeeping andnot caller-supplied. That is why this is a separate issue rather than the rest of #746: the
stamp needed no new state, and this needs a
Tagsfield on the stack record, aDescribeStacksmember, and a decision about what happens to a propagated tag when thecaller later removes it from the stack.
The seam #746 built is reusable:
StackDeployer.stampCFNResourceTagsis called from the oneplace that holds the physical ID and the stack context, so propagation is more tags through
the same call — but only for the resource types that path can resolve (EC2 today, see the
sibling issue on widening it).
Acceptance criteria
CreateStack'sTags.member.Nis recorded on the stack and reported byDescribeStacks, with AWS's documented limits and key/value patterns.UpdateStackcan add, change and remove a stack tag, and the removal reaches theresources the tag was propagated to.
caller-supplied tag whose key begins with
aws:is refused as AWS refuses it.docs/services.mdrecords what propagates, what does not, and why.Carved out of #746 (v0.109.0).