aws-cdk icon indicating copy to clipboard operation
aws-cdk copied to clipboard

aws-cdk-lib: incorrect rendering of CfnParameter in Fn.sub

Open zhan9san opened this issue 2 years ago • 2 comments

Describe the bug

The CloudFormation template generated by cdk synth is invalid if CfnParameter is in Fn.sub.

Similar to #14047 and #14068

Expected Behavior

The cdk code is valid after cdk synth runs

Current Behavior

    "Tags": [
     {
      "Key": "Environment",
      "Value": {
       "Fn::Sub": {
        "Fn::Join": [
         "",
         [
          "${AWS::StackName}-",
          {
           "Ref": "Environment"
          },
          "-foo"
         ]
        ]
       }
      }
     }
    ]
$ cfn-lint cdk.out/HelloWorldStack.template.json
E1019 Sub should be a string or array of 2 items for Resources/helloworldfunctionServiceRole6902C513/Properties/Tags/0/Value/Fn::Sub
cdk.out/HelloWorldStack.template.json:46:8

Reproduction Steps

    const env = new CfnParameter(this, 'Environment').valueAsString;
    Tags.of(this).add('Environment', Fn.sub('${AWS::StackName}-' + env + '-foo'))
$ cdk synth
$ cfn-lint cdk.out/HelloWorldStack.template.json
E1019 Sub should be a string or array of 2 items for Resources/helloworldfunctionServiceRole6902C513/Properties/Tags/0/Value/Fn::Sub
cdk.out/HelloWorldStack.template.json:46:8

Possible Solution

No response

Additional Information/Context

There is no issue if it is in the following format.

    const env = new CfnParameter(this, 'Environment').valueAsString;
    Tags.of(this).add('Environment', Fn.sub('${AWS::StackName}-' + '${env}' + '-foo', {env: env}))
    "Tags": [
     {
      "Key": "Environment",
      "Value": {
       "Fn::Sub": [
        "${AWS::StackName}-${env}-foo",
        {
         "env": {
          "Ref": "Environment"
         }
        }
       ]
      }
     }
    ]

CDK CLI Version

2.113.0 (build ccd534a)

Framework Version

No response

Node.js Version

v20.0.0

OS

MacOS

Language

TypeScript

Language Version

No response

Other information

No response

zhan9san avatar Dec 15 '23 15:12 zhan9san

I would write this way instead

Tags.of(this).add('Environment', `${Stack.of(this).stackName}-${env}-foo`);

Does it work for you?

pahud avatar Dec 15 '23 18:12 pahud

I would write this way instead

Tags.of(this).add('Environment', `${Stack.of(this).stackName}-${env}-foo`);

Does it work for you?

hi @pahud

Thanks for your suggestion.

I wonder what it is the recommended way to use fn.sub with cfnparameter.

If the way i do it is not correct, it would be great if it can be noted in the official document.

zhan9san avatar Dec 16 '23 03:12 zhan9san