Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS CDK API Gateway Construct Library

I'm trying to use the AWS_CDK for python to provision an apigateway integration. The typescript on https://pypi.org/project/aws-cdk.aws-apigateway/1.4.0/ is helpful, as is the unchecked python translation on https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_apigateway.README.html but it's not quite right.

I've tried to get the python version correct but I'm still missing something in the translation from TS to python. Currently my code snippet is;

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'"
        }
    }
    ]);

which returns

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

Any help greatly appreciated.

like image 653
Paul C Avatar asked Aug 03 '26 21:08

Paul C


1 Answers

So after a bunch more research, the issue was with the translation from TS to Python. It's important to remember that where parameters e.g. the value of integration_response, it is still TS. I found

I also found adding api_gateway method responses a bit non-intuitive as well, so in my working example below I've included it.

        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
            },
        }]
        );
like image 111
Paul C Avatar answered Aug 05 '26 09:08

Paul C



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!