Skip to content

Wrong routing when using Custom Domain Name #773

Closed
@pismy

Description

@pismy

I instantiated the Cookiecutter SAM for Python Lambda functions, embedded the Lambda Powertools as a layer, then deployed it to my AWS account: all good!

Then I tried to configure Custom Domain Name for my API Gateway, and the API internal routing is no longer working.

Calling the API through the default execute-api endpoint ✅

curl https://{my-api-id}.execute-api.{region}.amazonaws.com/Prod/hello/pismy

Returns 200 OK:

{"message": "hello pismy"}

With CloudWatch logs:

{
    "level": "INFO",
    "location": "decorate:345",
    "message": {
        "resource": "/hello/{name}",
        "path": "/hello/pismy",
        "httpMethod": "GET",
       ...
        "queryStringParameters": null,
        "multiValueQueryStringParameters": null,
        "pathParameters": null,
        "stageVariables": null,
        "requestContext": {
            "resourcePath": "/hello/{name}",
            "httpMethod": "GET",
            "path": "/Prod/hello/pismy",
            "stage": "Prod",
            "domainPrefix": "abcd1234",
            "domainName": "abcd1234.execute-api.us-east-1.amazonaws.com",
            "apiId": "abcd1234"
        },
        "body": null,
        "isBase64Encoded": false
    },
    ...
}

Calling the API through the Custom Domain Name 🟥

I first registered the API mapping with path hellopath

curl https://api.mydomain.xyz/hellopath/hello/pismy

Returns 404 Not Found:

{"statusCode":404,"message":"Not found"}

With CloudWatch logs:

{
    "level": "INFO",
    "location": "decorate:345",
    "message": {
        "resource": "/hello/{name}",
        "path": "/hellopath/hello/pismy",
        "httpMethod": "GET",
       ...
        "queryStringParameters": null,
        "multiValueQueryStringParameters": null,
        "pathParameters": null,
        "stageVariables": null,
        "requestContext": {
            "resourcePath": "/hello/{name}",
            "httpMethod": "GET",
            "path": "/hellopath/hello/pismy",
            "stage": "Prod",
            "domainPrefix": "api",
            "domainName": "api.mydomain.xyz",
            "apiId": "abcd1234"
        },
        "body": null,
        "isBase64Encoded": false
    },
    ...
}

Possible Solution

As I'm seeing the log in Cloud Watch, that means the request reaches my Lambda, but it must be the internal routing to the handler function that fails.

@app.get("/hello/<name>")
def hello_you(name):
    # query_strings_as_dict = app.current_event.query_string_parameters
    # json_payload = app.current_event.json_body
    return {"message": f"hello {name}"}

I guess Lambda Powertools must be using message.path or message.requestContext.path from the Lambda event rather than message.resource or message.requestContext.resource to implement the routing.

Unfortunately, when using Custom Domain Names, the message.path contains the API mapping prefix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions