-
Notifications
You must be signed in to change notification settings - Fork 3.9k
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(integ-tests-alpha): assertions handler is broken #26400
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The pull request linter has failed. See the aws-cdk-automation comment below for failure reasons. If you believe this pull request should receive an exemption, please comment and provide a justification.
A comment requesting an exemption should contain the text Exemption Request
. Additionally, if clarification is needed add Clarification Request
to a comment.
@mrgrain How is the error explained by the handle bundle being too large? It just creates a corrupt bundle? Also - what is too large? what limits are we subject to? |
Should we also change |
We incorrectly bundled parts of
Yes. Done. |
✅ Updated pull request passes all PRLinter validations. Dismissing previous PRLinter review.
packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/sdk.ts
Outdated
Show resolved
Hide resolved
@@ -88,7 +88,7 @@ export class AwsApiCallHandler extends CustomResourceHandler<AwsApiCallRequest, | |||
); | |||
|
|||
console.log(`SDK response received ${JSON.stringify(response)}`); | |||
delete response.ResponseMetadata; | |||
delete response.$metadata; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove the correct $metadata
field for v3.
9ebf6a8
to
d2a001d
Compare
AWS CodeBuild CI Report
Powered by github-codebuild-logs, available on the AWS Serverless Application Repository |
Thank you for contributing! Your pull request will be updated from main and then merged automatically (do not update manually, and be sure to allow changes to be pushed to your fork). |
## Summary Assertions handler is too large and not working. This PR extracts the SDK v2 to v3 features into a separate package. Reduces bundled size from `25.8mb` to `1.9mb` and restores the handlers functionality. ```bash $ esbuild --bundle lib/assertions/providers/lambda-handler/index.ts --target=node14 --platform=node --outfile=lib/assertions/providers/lambda-handler.bundle/index.js lib/assertions/providers/lambda-handler.bundle/index.js 1.9mb⚠️ ``` ## Why need this change? After merged aws#26271, Assertions lambda function throw error at initialize phase and not working. This reason of problem is maybe to import `aws-cdk-lib/custom-resources` to use aws-sdk v2-v3 translate features. `aws-cdk-lib/custom-resources` exports the some constructs, so when import the package, then bundle size is too large and lambda function is not working. ```log INIT_START Runtime Version: nodejs:18.v8 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:2755dc322c8dbb64760145d6403d14432af527bf4dd3cf03713aae10e0f8b552 -- 2023-07-13T05:49:25.501Z undefined ERROR Uncaught Exception { "errorType": "TypeError", "errorMessage": "Class extends value undefined is not a constructor or null", "stack": [ "TypeError: Class extends value undefined is not a constructor or null", " at ../../aws-cdk-lib/core/lib/cfn-condition.ts (/var/task/index.js:796267:5)", " at __init (/var/task/index.js:9:56)", " at ../../aws-cdk-lib/core/lib/private/metadata-resource.ts (/var/task/index.js:807546:5)", " at __init (/var/task/index.js:9:56)", " at ../../aws-cdk-lib/core/lib/private/synthesis.ts (/var/task/index.js:814923:5)", " at __init (/var/task/index.js:9:56)", " at ../../aws-cdk-lib/core/lib/app.ts (/var/task/index.js:814951:5)", " at __init (/var/task/index.js:9:56)", " at ../../aws-cdk-lib/core/lib/stack.ts (/var/task/index.js:816555:5)", " at __init (/var/task/index.js:9:56)" ] } START RequestId: b6da27f5-d7ff-4f76-807b-c7f5d1f02d1f Version: $LATEST Unknown application error occurredRuntime.Unknown END RequestId: b6da27f5-d7ff-4f76-807b-c7f5d1f02d1f REPORT RequestId: b6da27f5-d7ff-4f76-807b-c7f5d1f02d1f Duration: 13083.91 ms Billed Duration: 13084 ms Memory Size: 128 MB Max Memory Used: 128 MB ``` ## Solution Extract the SDK v2 to v3 features into a new private package that can be bundled safely. Also required changes to the `aws-custom-resource` v3 handler so it can used the shared code. To make sure that the bundled files are free of start-up errors, I have added them into a post build script. ## Additional changes **Update to Encode/Decode logic** All parameters passed to a Custom Resource will be converted to string when passed to the Lambda Function handler. This is a feature/limitation by CloudFormation. The previous implementation supported special handling for boolean values via a magic string. However with the SDK v3 parameter types on API Calls are more strictly enforced, e.g. we can't pass a string anymore when a number is expected. Therefore the encoding/decoding logic has been updated to indiscriminately encode _all_ parameters with `JSON.stringify()` and reverse the operation inside the assertions provider. **Lambda Invoke Payload** Withe the SDK v3, the type of the Payload returned from a Lambda Invoke operation is now a Buffer. This makes sense from an SDK perspective since the returned payload might be a binary. However assertions can only deal with JSON payloads, so we attempt to convert and parse the payload into a JSON object. If that fails it stays unchanged. ## Acknowledgements Thanks @WinterYukky for the initial investigation! Closes aws#26359 Replaces aws#26360 ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
Summary
Assertions handler is too large and not working. This PR extracts the SDK v2 to v3 features into a separate package.
Reduces bundled size from
25.8mb
to1.9mb
and restores the handlers functionality.Why need this change?
After merged #26271, Assertions lambda function throw error at initialize phase and not working. This reason of problem is maybe to import
aws-cdk-lib/custom-resources
to use aws-sdk v2-v3 translate features.aws-cdk-lib/custom-resources
exports the some constructs, so when import the package, then bundle size is too large and lambda function is not working.Solution
Extract the SDK v2 to v3 features into a new private package that can be bundled safely.
Also required changes to the
aws-custom-resource
v3 handler so it can used the shared code.To make sure that the bundled files are free of start-up errors, I have added them into a post build script.
Additional changes
Update to Encode/Decode logic
All parameters passed to a Custom Resource will be converted to string when passed to the Lambda Function handler.
This is a feature/limitation by CloudFormation.
The previous implementation supported special handling for boolean values via a magic string.
However with the SDK v3 parameter types on API Calls are more strictly enforced, e.g. we can't pass a string anymore when a number is expected.
Therefore the encoding/decoding logic has been updated to indiscriminately encode all parameters with
JSON.stringify()
and reverse the operation inside the assertions provider.Lambda Invoke Payload
Withe the SDK v3, the type of the Payload returned from a Lambda Invoke operation is now a Buffer.
This makes sense from an SDK perspective since the returned payload might be a binary.
However assertions can only deal with JSON payloads, so we attempt to convert and parse the payload into a JSON object.
If that fails it stays unchanged.
Acknowledgements
Thanks @WinterYukky for the initial investigation!
Closes #26359
Replaces #26360
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license