Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(core): cross-stack references to NestedStack list values produces invalid outputs #32575

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

brandondahler
Copy link

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


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license

@brandondahler brandondahler requested a review from a team as a code owner December 18, 2024 15:18
@github-actions github-actions bot added bug This issue is a bug. p2 beginning-contributor [Pilot] contributed between 0-2 PRs to the CDK labels Dec 18, 2024
@aws-cdk-automation aws-cdk-automation requested a review from a team December 18, 2024 15:18
@brandondahler brandondahler changed the title fix(core): cross-stack references to NestedStack list values produces invalid outputs (#27233) fix(core): cross-stack references to NestedStack list values produces invalid outputs Dec 18, 2024
@aws-cdk-automation aws-cdk-automation added the pr/needs-community-review This PR needs a review from a Trusted Community Member or Core Team Member. label Dec 18, 2024
Copy link
Contributor

@nmussy nmussy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly nits about coverage, LGTM overall though 👍

… invalid outputs

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 such into NestedStack instances if a reference to that resource's list attribute needs to be referenced in 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.

To fix this issue, a similar strategy to `exportStringListValue` is used to join 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 re-exported 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.

fixes aws#27233

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
@brandondahler brandondahler force-pushed the features/NestedStackListReference branch from 8219bff to 28721e3 Compare December 20, 2024 00:51
@aws-cdk-automation
Copy link
Collaborator

AWS CodeBuild CI Report

  • CodeBuild project: AutoBuildv2Project1C6BFA3F-wQm2hXv2jqQv
  • Commit ID: 28721e3
  • Result: SUCCEEDED
  • Build Logs (available for 30 days)

Powered by github-codebuild-logs, available on the AWS Serverless Application Repository

@aws-cdk-automation aws-cdk-automation removed the pr/needs-community-review This PR needs a review from a Trusted Community Member or Core Team Member. label Dec 20, 2024
Copy link
Contributor

@nmussy nmussy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for the changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
beginning-contributor [Pilot] contributed between 0-2 PRs to the CDK bug This issue is a bug. p2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

(cloudformation-include): Cannot use computed outputs from nested stack
3 participants