Reputation: 1597
My efforts to enable request validation through cdk with typescript have not worked. Having worked around some known bus of the environment, I arrived at this:
const req = new apiGateway.RequestValidator(this, lambdaName, {
restApi: this._api,
requestValidatorName: lambdaName,
validateRequestBody: false,
validateRequestParameters: true
});
// this._methodOptions.requestValidator = {},
this._methodOptions.requestValidator = req;
The error I recieve is TypeError: Cannot read property 'children' of undefined
.
TypeError: Cannot read property 'children' of undefined
at synthNestedAssemblies (proj\cdk\node_modules\@aws-cdk\core\lib\private\synthesis.ts:50:33)
at synthNestedAssemblies (proj\cdk\node_modules\@aws-cdk\core\lib\private\synthesis.ts:54:7)
at synthNestedAssemblies (proj\cdk\node_modules\@aws-cdk\core\lib\private\synthesis.ts:54:7)
at synthNestedAssemblies (proj\cdk\node_modules\@aws-cdk\core\lib\private\synthesis.ts:54:7)
at Object.synthesize (proj\cdk\node_modules\@aws-cdk\core\lib\private\synthesis.ts:14:3)
at App.synth (proj\cdk\node_modules\@aws-cdk\core\lib\stage.ts:188:23)
at process.App.process.once (proj\cdk\node_modules\@aws-cdk\core\lib\app.ts:123:45)
at Object.onceWrapper (events.js:277:13)
at process.emit (events.js:189:13)
at process.EventEmitter.emit (domain.js:441:20)
I suspect there are some issues under the hood still. Anyone know how to get this working?
Edit: Adding info on how _methodOptions was built up
private _reqValidatorQueryStrHeaders: apiGateway.RequestValidator;
// Create validators to use in method options
private _initValidators() {
this._reqValidatorAll = this._api.addRequestValidator("validate-request-all", {
requestValidatorName: "req-validator-all",
validateRequestBody: true,
validateRequestParameters: true,
});
this._reqValidatorBody = this._api.addRequestValidator("validate-request-body", {
requestValidatorName: "req-validator-body",
validateRequestBody: true,
validateRequestParameters: true,
});
this._reqValidatorQueryStrHeaders = this._api.addRequestValidator("validate-request-query-etc", {
requestValidatorName: "req-validator-query-and-headers",
validateRequestBody: true,
validateRequestParameters: true,
});
}
private _initDefMethodOptions(uniqueId: string) {
this._defMethodOptions = {
// Method Request Quadrant:
// ------------------------
// Cognito Auth
authorizer: {authorizerId: this._auth.ref},
authorizationType: apiGateway.AuthorizationType.COGNITO,
// Request Validation - works *with* requestParameters & requestModels
requestValidator: {
Name: uniqueId
},
requestParameters: {
'method.request.querystring.unused': false // required True
},
// apiKeyRequired: false,
// Method Response Quadrant:
// ------------------------
methodResponses: [
{
// Successful response from the integration
statusCode: '200',
// Define what parameters are allowed or not
responseParameters: {
'method.response.header.Access-Control-Allow-Origin': true,
// 'method.response.header.Content-Type': true,
// 'method.response.header.Access-Control-Allow-Credentials': true // don't need this with cognito credentials...
},
// // Validate the schema on the response
// responseModels: {
// 'application/json': responseModel
// }
},
{
// Same thing for the error responses
statusCode: '400',
responseParameters: { //is this necessary with the api wide default set above?
'method.response.header.Access-Control-Allow-Origin': true,
// 'method.response.header.Content-Type': true,
// 'method.response.header.Access-Control-Allow-Credentials': true
},
// responseModels: {
// 'application/json': errorResponseModel
// }
},
{
statusCode: '403',
responseParameters: {
'method.response.header.Access-Control-Allow-Origin': true,
},
},
{
statusCode: '500',
responseParameters: {
'method.response.header.Access-Control-Allow-Origin': true,
},
}
]
};
return this._defMethodOptions;
}
/* In other function */
this._methodOptions = this._initDefMethodOptions(lambdaName);
let queryList : string[] = options.reqParams;
if (typeof (queryList) !== "undefined") {
// this._methodOptions.requestValidator = { Name: lambdaName }; // does nothing. Wrong class.
// this._methodOptions.requestValidator = this._getRequestValidator(lambdaName); // crashes!
// Using the fix from answer:
this._methodOptions.requestValidator = this._reqValidatorQueryStrHeaders;
Upvotes: 1
Views: 3302
Reputation: 915
The issue has been fixed on apr 27th 2023.
Please refer https://github.com/aws/aws-cdk/pull/25324
Here are the details of the fix.
I followed these steps successfully.
"dependencies": {
"aws-cdk-lib": "2.98.0"
}
Run npm install
(this will update your project with the necessary files)
Then as described in the ReadMe.md file (in "Details of the fix")
you need to set the @aws-cdk/aws-apigateway:requestValidatorUniqueId
feature flag
I did that by adding the following line in the context section of the cdk.json
"context": {
"@aws-cdk/aws-apigateway:requestValidatorUniqueId": true
}
Upvotes: 0
Reputation: 10333
We can pass in validator to Method Options.
/**
* Basic Rest Api
*/
const myRestApi = new apigateway.RestApi(this, "rest-api", {});
/**
* A Validator
*/
const myValidator = myRestApi.addRequestValidator("validate-request", {
requestValidatorName: "my-request-validator",
validateRequestBody: true,
validateRequestParameters: true,
});
/**
* Simple Method attaching the validator.
*/
const postMethod = myRestApi.root.addMethod(
"POST",
new apigw.MockIntegration(),
{
requestValidator: myValidator,
}
);
Upvotes: 4