fix(codepipeline-actions): correct double JSON encoding in CodeBuildAction environment variables with tokens #36097
+85
−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 # (if applicable)
Closes #36076.
Reason for this change
When using
CodeBuildActionwith environment variables containing tokens (CloudFormation intrinsic functions likeFn.ref(),Fn.getAtt(), etc.), the JSON values are double-encoded. This causes CodeBuild to receive malformed JSON strings like{\"key\":\"value\"}instead of{"key":"value"}, breaking JSON parsing at runtime and preventing proper pipeline execution.Description of changes
Modified the
CodeBuildAction.bound()method to properly handle environment variables containing tokens:Stack.toJsonString()on already-serialized environment variables, causing double encoding when tokens were presentLazy.string()wrappingJSON.stringify()for proper deferred evaluation{ Ref: 'MyParameter' }are correctly embedded in CloudFormationFn::Joinexpressions without double-encodingBefore:
After:
This fix ensures that tokens are properly resolved by CloudFormation at deployment time without double-encoding, while maintaining construct-time validation for secrets in plaintext environment variables.
why this works
[{ name: 'VAR', type: 'PLAINTEXT', value: <token> }]The magic is that JSON.stringify() inside Lazy.string() works with CDK's token system:
Describe any new or updated permissions being added
N/A - No IAM permissions or resource access changes.
Description of how you validated changes
'environment variables with tokens are correctly serialized'that validates properFn::Joinstructure with embedded token references and confirms no double-encoding occurs. All 190 unit tests pass (189 existing + 1 new).Fn::Joinexpressions for CloudFormation resolution at deployment time.Checklist
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license