Skip to content

Commit

Permalink
fix(core): cross-stack references to NestedStack list values produces…
Browse files Browse the repository at this point in the history
… 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*
  • Loading branch information
brandondahler authored Feb 25, 2025
1 parent e03d112 commit f9252ab
Show file tree
Hide file tree
Showing 16 changed files with 32,018 additions and 8 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"Resources": {
"RequiredResourceA026AF42": {
"Type": "AWS::S3::Bucket",
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain"
}
},
"Outputs": {
"StringReference": {
"Value": {
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedString6B1C0634Ref48A5688D"
}
},
"NumberReference": {
"Value": {
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedNumberEF88914ERefF4C5CBF2"
}
},
"ListReference": {
"Value": {
"Fn::Join": [
"$$",
{
"Fn::Split": [
"||",
{
"Fn::ImportValue": "Producer:ExportsOutputFnGetAttNestedNestedStackNestedNestedStackResourceDEFDAA4DOutputsProducerNestedNestedListCF0BC56DRefE50D3EDA"
}
]
}
]
}
}
},
"Parameters": {
"BootstrapVersion": {
"Type": "AWS::SSM::Parameter::Value<String>",
"Default": "/cdk-bootstrap/hnb659fds/version",
"Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
}
},
"Rules": {
"CheckBootstrapVersion": {
"Assertions": [
{
"Assert": {
"Fn::Not": [
{
"Fn::Contains": [
[
"1",
"2",
"3",
"4",
"5"
],
{
"Ref": "BootstrapVersion"
}
]
}
]
},
"AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
}
]
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit f9252ab

Please sign in to comment.