fix(core): cross-stack references to NestedStack list values produces invalid outputs #32575
+2,242
−5
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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: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 aInterfaceVpcEndpoint
instance in a nested stack and attempting to reference itsvpcEndpointDnsEntries
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
Checklist
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license