python - AWS CDK API Gateway 构造库
问题描述
我正在尝试使用 AWS_CDK for python 来配置 apigateway 集成。https://pypi.org/project/aws-cdk.aws-apigateway/1.4.0/上的打字稿很有帮助,就像 https://docs.aws.amazon.com/cdk/api 上未经检查的 python 翻译一样/latest/python/aws_cdk.aws_apigateway.README.html但它不太正确。
我试图让 python 版本正确,但在从 TS 到 python 的翻译中我仍然遗漏了一些东西。目前我的代码片段是;
getRisksIntegration = apigw.LambdaIntegration(self.getRisksFunction, proxy = False,
integration_responses=[{
# Successful response from the Lambda function, no filter defined
# - the selectionPattern filter only tests the error message
# We will set the response status code to 200
"statusCode": "200",
"response_templates": {
# This template takes the "message" result from the Lambda function, adn embeds it in a JSON response
# Check https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
"application/json": "JSON.stringify(state='ok', greeting='$util.escapeJavaScript($input.body)')"
},
"response_parameters": {
# We can map response parameters
# - Destination parameters (the key) are the response parameters (used in mappings)
# - Source parameters (the value) are the integration response parameters or expressions
"method.response.header._content-_type": "'application/json'",
"method.response.header._access-_control-_allow-_origin": "'*'",
"method.response.header._access-_control-_allow-_credentials": "'true'"
}
}, {
# For errors, we check if the error message is not empty, get the error data
"selection_pattern": "(|.)+",
# We will set the response status code to 200
"status_code": "400",
"response_templates": {
"application/json": "JSON.stringify(state='error', message='$util.escapeJavaScript($input.path('$.errorMessage'))')"
},
"response_parameters": {
"method.response.header._content-_type": "'application/json'",
"method.response.header._access-_control-_allow-_origin": "'*'",
"method.response.header._access-_control-_allow-_credentials": "'true'"
}
}
]);
返回
jsii.errors.JavaScriptError:
Error: Missing required properties for @aws-cdk/aws-apigateway.IntegrationResponse: statusCode
at validateRequiredProps (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7228:15)
at Object.deserialize (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:6900:21)
at Kernel._toSandbox (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:8222:61)
at value.map.x (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:6796:40)
at Array.map (<anonymous>)
at Object.deserialize (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:6796:26)
at Kernel._toSandbox (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:8222:61)
at mapValues (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:6906:29)
at mapValues (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7167:27)
at Kernel._wrapSandboxCode (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:8316:19)
at Kernel._create (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:26)
at Kernel.create (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7600:21)
at KernelHost.processRequest (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7388:28)
at KernelHost.run (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7328:14)
at Immediate.setImmediate [as _onImmediate] (/home/ec2-user/environment/thoth/.env/lib/python3.6/dist-packages/jsii/_embedded/jsii/jsii-runtime.js:7331:37)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "app.py", line 41, in <module>
gremlin_layer = layer_stack.gremlin_python_layer,
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/jsii/_runtime.py", line 66, in __call__
inst = super().__call__(*args, **kwargs)
File "/home/ec2-user/environment/thoth/stacks/api_stack.py", line 110, in __init__
"method.response.header._access-_control-_allow-_credentials": "'true'"
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/jsii/_runtime.py", line 66, in __call__
inst = super().__call__(*args, **kwargs)
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/aws_cdk/aws_apigateway/__init__.py", line 17765, in __init__
jsii.create(LambdaIntegration, self, [handler, options])
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/jsii/_kernel/__init__.py", line 229, in create
interfaces=[iface.__jsii_type__ for iface in getattr(klass, "__jsii_ifaces__", [])],
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/jsii/_kernel/providers/process.py", line 333, in create
return self._process.send(request, CreateResponse)
File "/home/ec2-user/environment/thoth/.env/lib64/python3.6/dist-packages/jsii/_kernel/providers/process.py", line 318, in send
raise JSIIError(resp.error) from JavaScriptError(resp.stack)
jsii.errors.JSIIError: Missing required properties for @aws-cdk/aws-apigateway.IntegrationResponse: statusCode
Subprocess exited with error 1
非常感谢任何帮助。
解决方案
因此,经过大量研究,问题在于从 TS 到 Python 的翻译。重要的是要记住参数,例如 integration_response 的值,它仍然是 TS。我发现
我还发现添加 api_gateway 方法响应也有点不直观,所以在下面的工作示例中我已经包含了它。
getRisksIntegration = apigw.LambdaIntegration(self.getRisksFunction,
proxy = False,
# request_parameters = {},
# allow_test_invoke = True,
# request_templates = {},
integration_responses=[{
# Successful response from the Lambda function, no filter defined
# - the selectionPattern filter only tests the error message
# We will set the response status code to 200
"statusCode": "200",
"contentHandling": "Passthrough",
"responseTemplates": {
# This template takes the "message" result from the Lambda function, and embeds it in a JSON response
# Check https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
# "application/json": "JSON.stringify(state='ok', greeting='$util.escapeJavaScript($input.body)')"
},
"responseParameters": {
# We can map response parameters
# - Destination parameters (the key) are the response parameters (used in mappings)
# - Source parameters (the value) are the integration response parameters or expressions
"method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'",
"method.response.header.Access-Control-Allow-Methods": "'*'",
"method.response.header.Access-Control-Allow-Origin": "'*'"
}
},{
# For errors, we check if the error message is not empty, get the error data
# "selection_pattern": "(|.)+",
# We will set the response status code to 200
"statusCode": "400",
"responseTemplates": {
# "application/json": "JSON.stringify(state='error', message='$util.escapeJavaScript($input.path('$.errorMessage'))')"
},
"responseParameters": {
"method.response.header._content-_type": "'application/json'",
"method.response.header._access-_control-_allow-_origin": "'*'",
"method.response.header._access-_control-_allow-_credentials": "'true'"
}
}],
);
getRisks.add_method('GET', getRisksIntegration,
method_responses = [{
"statusCode": "200",
"responseParameters": {
"method.response.header.Access-Control-Allow-Headers": True,
"method.response.header.Access-Control-Allow-Methods": True,
"method.response.header.Access-Control-Allow-Origin": True
},
}]
);
推荐阅读
- wordpress - SSL Mixed Content WordPress Site. TRIED EVERYTHING
- css - 跨度中的显示块不起作用。我怎样才能使它跨越与前一个跨度相同的宽度?
- codeigniter - Codeigniter 管理面板路由问题
- java - 没有使用 EcpliseLInk 2.6.7 选择正确的映射
- c++ - doxygen 文档中缺少生成的文件
- firebase - 如何使用 Xamarin Forms 进行 Firebase 云消息传递?(iOS和安卓)
- go - 如何使用自定义属性编组/解组 Golang OAuth2.0 令牌
- perl - Nginx反向代理配置让Mojolicious $self->req->url->to_abs 丢弃端口号
- typescript - 为什么 TypeScript 编译器在返回任何类型时不抱怨?
- php - 如何在 .Net Framework 中呈现部分视图