Skip to content

Commit f9252ab

Browse files
fix(core): cross-stack references to NestedStack list values produces invalid outputs (#32575)
### Issue # Closes #27233. ### Reason for this change Referencing a list attribute of a resource defined within a `NestedStack` synthesizes successfully but the nested stack will fail deployment with the error: ``` Template format error: Every Value member must be a string. ``` This prevents deploying resources into a `NestedStack` instance if a reference to one of that resource's list attribute exists within a cross-stack context. For example, deploying a `InterfaceVpcEndpoint` instance in a nested stack and attempting to reference its `vpcEndpointDnsEntries` property within a different stack will cause this error. See new integration test at `packages/@aws-cdk-testing/framework-integ/test/core/test/integ.nested-stack-references.ts` for minimal reproduction. ### Description of changes A similar strategy to `exportStringListValue` is used to serialized the reference's values into a string and expose that value as the output from the nested stack. The reference to the serialized value is then made exportable as normally needed to hoist it to the top-level parent stack. The final reference that imports the value is then re-written to also deserialize the imported string back to the original list. The return types of some internal methods were modified to handle the fact that core/lib/private/refs.ts's `getExportable` no longer *necessarily* returns a Reference. This was needed because an exportable may now be a value derived from a reference instead of only a direct reference. ### Describe any new or updated permissions being added N/A ### Description of how you validated changes * Added unit test to verify low-level operation * Added integration test to verify high-level behavior and deploy-ability * Executed integration test within a personal account to verify success ### Checklist - [X] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent e03d112 commit f9252ab

File tree

16 files changed

+32018
-8
lines changed

16 files changed

+32018
-8
lines changed

packages/@aws-cdk-testing/framework-integ/test/core/test/integ.nested-stack-references.js.snapshot/Consumer.assets.json

+19
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{
2+
"Resources": {
3+
"RequiredResourceA026AF42": {
4+
"Type": "AWS::S3::Bucket",
5+
"UpdateReplacePolicy": "Retain",
6+
"DeletionPolicy": "Retain"
7+
}
8+
},
9+
"Outputs": {
10+
"StringReference": {
11+
"Value": {
12+
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedString6B1C0634Ref48A5688D"
13+
}
14+
},
15+
"NumberReference": {
16+
"Value": {
17+
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedNumberEF88914ERefF4C5CBF2"
18+
}
19+
},
20+
"ListReference": {
21+
"Value": {
22+
"Fn::Join": [
23+
"$$",
24+
{
25+
"Fn::Split": [
26+
"||",
27+
{
28+
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedListCF0BC56DRefE50D3EDA"
29+
}
30+
]
31+
}
32+
]
33+
}
34+
}
35+
},
36+
"Parameters": {
37+
"BootstrapVersion": {
38+
"Type": "AWS::SSM::Parameter::Value<String>",
39+
"Default": "/cdk-bootstrap/hnb659fds/version",
40+
"Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
41+
}
42+
},
43+
"Rules": {
44+
"CheckBootstrapVersion": {
45+
"Assertions": [
46+
{
47+
"Assert": {
48+
"Fn::Not": [
49+
{
50+
"Fn::Contains": [
51+
[
52+
"1",
53+
"2",
54+
"3",
55+
"4",
56+
"5"
57+
],
58+
{
59+
"Ref": "BootstrapVersion"
60+
}
61+
]
62+
}
63+
]
64+
},
65+
"AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
66+
}
67+
]
68+
}
69+
}
70+
}

packages/@aws-cdk-testing/framework-integ/test/core/test/integ.nested-stack-references.js.snapshot/NestedStackReferencesDefaultTestDeployAssertFE4F9D3A.assets.json

+32
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@aws-cdk-testing/framework-integ/test/core/test/integ.nested-stack-references.js.snapshot/NestedStackReferencesDefaultTestDeployAssertFE4F9D3A.template.json

+262
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)