CFN even goes as far as having two ways to pull off that stunt, magic prefixes and objects
Properties:
ImageId: !Ref MyAwesomeAmi
# or
ImageId:
Ref: MyAwesomeAmi
# or cursed "{{resolve" syntax
ImageId: !Join
- ''
- - '{{resolve:ssm:/aws/service/bottlerocket/aws-k8s-'
- Ref: EksVersion
- '/x86_64/latest/image_id}}'
# which ends up being "ImageId: '{{resolve:ssm:/aws/service/bottlerocket/aws-k8s-1.31/x86_64/latest/image_id}}'" and then *that* gets replaced by the CFN service at provisioning time