使用 AWS CDK 将请求验证器添加到 API 网关

问题描述 投票:0回答:2

我正在尝试使用 AWS CDK 对 AWS API 网关的 GET 请求执行请求验证,特别是查询参数验证:

const api = apigw.RestApi.fromRestApiAttributes(this, props.attributes.apiGatewayName, {
  restApiId: cdk.Fn.importValue('th-api-id'),
  rootResourceId: cdk.Fn.importValue('th-api-resource-id'),
});

api.root
  .resourceForPath("/trackCartons")
  .addMethod("GET", new apigw.LambdaIntegration(trackCartonsHandler), {
    requestParameters: {
      'method.request.querystring.cartonID': true
    },
    requestValidatorOptions: {
      validateRequestParameters: true,
    },
  });

上面的代码给出了错误:

TypeError: this.api.addRequestValidator is not a function
    at Method.requestValidatorId (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1:5827)
    at new Method (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1:2701)        
    at Resource.addMethod (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\resource.js:1:1188)
    at new CartonDeliveryStack (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\lib\carton-delivery-stack.js:95:8)
    at Object.<anonymous> (C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\bin\carton-delivery.js:28:1)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)

Node.js v18.16.1

它还会转储路径的代码

C:\Users\Sushant Sinha\Desktop\aws\carton-delivery\node_modules\aws-cdk-lib\aws-apigateway\lib\method.js:1

到控制台。

没有验证器,API 可以完美运行。我已经将“resourceForPath”更改为“addResource”方法,但除此之外,整个代码似乎与互联网上的代码相同。

amazon-web-services aws-api-gateway aws-cdk
2个回答
2
投票

查看 CDK 文档,看起来静态

RestApi.fromRestApiAttributes
方法返回类型
IRestApi

IRestApi
接口未定义
addRequestValidator
方法 - 这可能是问题的根源,因为
Method
的CDK实现似乎正在尝试使用
addRequestValidator
方法。

我建议如果可能的话重构您的代码,这样您就可以通过 props 传递对

RestApi
构造的引用,而不是从导入的属性实例化
RestApi
。这确实假设您的 API 也在同一包的 CDK 中定义,但从问题中尚不清楚。您的新代码可能如下所示:


interface TrackCartonsApiProps {
    readonly api: RestApi
}

class TrackCartonsApi extends Construct {
    constructor(scope: Construct, id: string, props: TrackCartonsApiProps) {
        props.api.root
            .resourceForPath("/trackCartons")
            .addMethod("GET", new apigw.LambdaIntegration(trackCartonsHandler), {
                requestParameters: {
                  'method.request.querystring.cartonID': true
                },
                requestValidatorOptions: {
                  validateRequestParameters: true,
                },
            });
    }
}

来自定义根 api 的构造或堆栈:

const api = ...

const trackCartonsApi = new TrackCartonsApi(this, 'TrackCartonsApi', {
    api: api
});

0
投票

我知道这个问题很老了,但我还没有在网上找到解决方案,所以我查看了代码并找到了一个。

所以基本上您仍然可以使用 IRestApi 并通过实例化 RequestValidator 并将其作为方法选项传递给您的方法来添加 requestValidator。

const restApi = RestApi.fromRestApiAttributes(this, 'APIGW', {
  restApiId: config['rest-api-id'],
  restApiName: config['rest-api-name'],
  rootResourceId: config['rest-api-root-id']
});

...

const requestValidator = new RequestValidator(this, 'id', {
  restApi: restApi,
  validateRequestBody: true
})

const reource = typeResource.addResource('test');
dataReource.addMethod('PUT', new LambdaIntegration(testLambda, {
  proxy: true
}), {
  requestValidator: requestValidator
});
© www.soinside.com 2019 - 2024. All rights reserved.