cdk synth works fine if the context values are defined in cdk.json with their corresponding types (numeric / boolean). For example:
{
"app": "node bin/topdesk.js",
"context": {
"max_expected_uri_size": 512,
"foo": false
}
}
However, when using the cli flag --context these same context values do not get parsed to any type. They are treated as strings and thus breaks cdk synth --context "foo=false" if a type is expected besides string.
$ cdk synth --context "foo=false"
/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/runtime.ts:141
throw new CfnSynthesisError(message);
^
While synthesizing TopdeskStack/WAFSizeRestrictionRule: Supplied properties not correct for "CfnRuleProps"
predicates: element 0: supplied properties not correct for "PredicateProperty"
negated: "false" should be a boolean
--- resource created at ---
at new TopdeskStack (/Users/ash/Projects/VFZiggo/aws/topdesk/lib/topdesk-stack.ts:28:36)
at Object.<anonymous> (/Users/ash/Projects/VFZiggo/aws/topdesk/bin/topdesk.ts:7:1)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
--- problem discovered at ---
at ValidationResult.assertSuccess (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/runtime.ts:141:13)
at cfnRulePropsToCloudFormation (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/aws-wafregional/lib/wafregional.generated.ts:405:39)
at CfnRule.renderProperties (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/aws-wafregional/lib/wafregional.generated.ts:444:16)
at CfnRule._toCloudFormation (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/cfn-resource.ts:214:31)
at elements.map.e (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/stack.ts:203:63)
at Array.map (<anonymous>)
at TopdeskStack._toCloudFormation (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/stack.ts:203:34)
at TopdeskStack.synthesize (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/stack.ts:497:44)
at Synthesizer.synthesize (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/synthesis.ts:58:11)
at App.run (/Users/ash/Projects/VFZiggo/aws/topdesk/node_modules/@aws-cdk/cdk/lib/app.ts:74:27)
Subprocess exited with error 1
The types of values passed over the CLI are ambiguous - how do we know you meant true instead of the string "true"? I can think of three options for addressing this:
cdk synth --context "foo:boolean=false", or change the --context flag to accept JSON, e.g. cdk synth --context '{"foo": false}parseInt, parseFloat and parseBool before assuming a value is a string. Doesn't solve the problem as the ambiguity is still there ... we can't assume all "true" strings are of type boolean.@sam-goodwin I think both option 2 and 3 can introduce breaking changes.
Option 2: can introduce incorrect type for AWS::ECS::TaskDefinition -> CPU attribute. This attribute can contain an integer value as a string.
Option 3: can prevent existing deployments from deploying (thus breaking change) based on some unforseen reason (I can't think of any right now)
With regards to option 1, type annotation seems like yet another syntax to remember even though it is Typescript it differs from what is in cdk.json.
I think accepting JSON is a nice way of dealing with this. :)
+1 For setting context as JSON as @sam-goodwin suggested.
Most helpful comment
The types of values passed over the CLI are ambiguous - how do we know you meant
trueinstead of the string"true"? I can think of three options for addressing this:cdk synth --context "foo:boolean=false", or change the--contextflag to accept JSON, e.g.cdk synth --context '{"foo": false}parseInt,parseFloatandparseBoolbefore assuming a value is astring. Doesn't solve the problem as the ambiguity is still there ... we can't assume all"true"strings are of typeboolean.