Skip to content

Bug: LambdaFunctionUrlResolver doesn't recognize Query parameters #6727

@jerevnp

Description

@jerevnp

Expected Behaviour

From the latest docs, given:

@app.get("/todos")
@tracer.capture_method
def get_todos(completed: Annotated[Optional[str], Query(min_length=4)] = None) -> Dict:  
    """
    """
    return {
        "completed": completed
    }

Calling /todos?completed=value1 should return

{
  "completed": "value1"
}

Current Behaviour

Calling /todos?completed=value1 returns

{
  "completed": null
}

Code snippet

from typing import Annotated, Dict, List, Optional
from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.event_handler import LambdaFunctionUrlResolver
from aws_lambda_powertools.event_handler.openapi.params import Path, Query
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing import LambdaContext

tracer = Tracer()
logger = Logger()
app = LambdaFunctionUrlResolver()

@app.get("/todos")
@tracer.capture_method
def get_todos(completed: Annotated[Optional[str], Query(min_length=4)] = None) -> Dict:  
    """
    """
    return {
        "completed": completed,
    }


@logger.inject_lambda_context(correlation_id_path=correlation_paths.LAMBDA_FUNCTION_URL, log_event=True)
@tracer.capture_lambda_handler(capture_response=False)
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    """
    Lambda entrypoint for Azure Function URL
    """
    return app.resolve(event, context)

Possible Solution

No response

Steps to Reproduce

Please see full reproduction example with complete instruction here: https://github.com/jerevnp/sandbox/tree/aws-lambda-powertools-for-python-lambda-queryparams

Powertools for AWS Lambda (Python) version

latest

AWS Lambda function runtime

3.13

Packaging format used

PyPi

Debugging logs

27 May 2025 10:13:20,178 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)
27 May 2025 10:13:27,331 [INFO] (rapid) INIT START(type: on-demand, phase: init)
27 May 2025 10:13:27,331 [INFO] (rapid) The extension's directory "/opt/extensions" does not exist, assuming no extensions to be loaded.
START RequestId: 740881ee-7d4c-43c0-896d-2d2b2a7a62ec Version: $LATEST
27 May 2025 10:13:27,331 [INFO] (rapid) Starting runtime without AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN , Expected?: false
/var/task/aws_lambda_powertools/package_logger.py:20: UserWarning: POWERTOOLS_DEBUG environment variable is enabled. Setting logging level to DEBUG.
  if powertools_debug_is_set():
2025-05-27 10:13:27,458 aws_lambda_powertools.tracing.tracer [DEBUG] Verifying whether Tracing has been disabled
[DEBUG]	2025-05-27T10:13:27.458Z		Verifying whether Tracing has been disabled
2025-05-27 10:13:27,514 aws_lambda_powertools.logging.logger [DEBUG] Adding filter in root logger to suppress child logger records to bubble up
[DEBUG]	2025-05-27T10:13:27.514Z		Adding filter in root logger to suppress child logger records to bubble up
2025-05-27 10:13:27,514 aws_lambda_powertools.logging.logger [DEBUG] Marking logger service_undefined as preconfigured
[DEBUG]	2025-05-27T10:13:27.514Z		Marking logger service_undefined as preconfigured
2025-05-27 10:13:27,514 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Adding route using rule /todos and methods: GET
[DEBUG]	2025-05-27T10:13:27.514Z		Adding route using rule /todos and methods: GET
2025-05-27 10:13:27,514 aws_lambda_powertools.logging.logger [DEBUG] Decorator called with parameters
[DEBUG]	2025-05-27T10:13:27.514Z		Decorator called with parameters
2025-05-27 10:13:27,514 aws_lambda_powertools.tracing.tracer [DEBUG] Decorator called with parameters
[DEBUG]	2025-05-27T10:13:27.514Z		Decorator called with parameters
27 May 2025 10:13:27,515 [INFO] (rapid) INIT RTDONE(status: success)
27 May 2025 10:13:27,515 [INFO] (rapid) INIT REPORT(durationMs: 184.457000)
27 May 2025 10:13:27,515 [INFO] (rapid) INVOKE START(requestId: 9c3619b2-af72-4130-894f-e78937983e53)
2025-05-27 10:13:27,515 aws_lambda_powertools.utilities.jmespath_utils [DEBUG] Envelope detected: requestContext.requestId. JMESPath options: {'custom_functions': <aws_lambda_powertools.utilities.jmespath_utils.PowertoolsFunctions object at 0xfc5cf111de80>}
[DEBUG]	2025-05-27T10:13:27.515Z	9c3619b2-af72-4130-894f-e78937983e53	Envelope detected: requestContext.requestId. JMESPath options: {'custom_functions': <aws_lambda_powertools.utilities.jmespath_utils.PowertoolsFunctions object at 0xfc5cf111de80>}
2025-05-27 10:13:27,516 aws_lambda_powertools.logging.logger [DEBUG] Event received
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Event received
{"level":"INFO","location":"decorate:535","message":{"version":"2.0","routeKey":"$default","rawPath":"/todos","rawQueryString":"completed=value1","cookies":["cookie1","cookie2"],"headers":{"request-id":"|f46f2ae8a26fe9c2d549a6e33e6e434b.4ee2108cfa78ff4b.","accept":"*/*","accept-encoding":"gzip,deflate,br","user-agent":"PostmanRuntime/7.44.0"},"queryStringParameters":{"completed":"value1"},"requestContext":{"accountId":"123456789012","apiId":"<urlid>","authentication":null,"authorizer":{"iam":{"accessKey":"AKIA...","accountId":"111122223333","callerId":"AIDA...","cognitoIdentity":null,"principalOrgId":null,"userArn":"arn:aws:iam::111122223333:user/example-user","userId":"AIDA..."}},"domainName":"<url-id>.lambda-url.us-west-2.on.aws","domainPrefix":"<url-id>","http":{"method":"GET","path":"/todos","protocol":"HTTP/1.1","sourceIp":"123.123.123.123","userAgent":"agent"},"requestId":"id","routeKey":"$default","stage":"$default","time":"12/Mar/2020:19:03:58 +0000","timeEpoch":1583348638390},"body":"Hello from client!","pathParameters":null,"isBase64Encoded":false,"stageVariables":null},"timestamp":"2025-05-27 10:13:27,516+0000","service":"service_undefined","cold_start":true,"function_name":"test_function","function_memory_size":"3008","function_arn":"arn:aws:lambda:us-east-1:012345678912:function:test_function","function_request_id":"9c3619b2-af72-4130-894f-e78937983e53","correlation_id":"id"}
[WARNING]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Subsegment ## lambda_handler discarded due to Lambda worker still initializing
2025-05-27 10:13:27,516 aws_lambda_powertools.tracing.tracer [DEBUG] Calling lambda handler
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Calling lambda handler
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Converting event to Lambda Function URL contract
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Converting event to Lambda Function URL contract
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Found a registered route. Calling function
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Found a registered route. Calling function
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Building middleware stack: []
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Building middleware stack: []
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] MiddlewareFrame: [_registered_api_adapter] next call chain is _registered_api_adapter -> get_todos
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	MiddlewareFrame: [_registered_api_adapter] next call chain is _registered_api_adapter -> get_todos
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Calling API Route Handler: {}
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Calling API Route Handler: {}
[WARNING]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Subsegment ## app.reproduce.get_todos discarded due to Lambda worker still initializing
2025-05-27 10:13:27,516 aws_lambda_powertools.tracing.tracer [DEBUG] Calling method: app.reproduce.get_todos
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Calling method: app.reproduce.get_todos
2025-05-27 10:13:27,516 aws_lambda_powertools.event_handler.api_gateway [DEBUG] Simple response detected, serializing return before constructing final response
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Simple response detected, serializing return before constructing final response
2025-05-27 10:13:27,516 aws_lambda_powertools.tracing.tracer [DEBUG] Received lambda handler response successfully
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Received lambda handler response successfully
2025-05-27 10:13:27,516 aws_lambda_powertools.tracing.tracer [DEBUG] Annotating cold start
[DEBUG]	2025-05-27T10:13:27.516Z	9c3619b2-af72-4130-894f-e78937983e53	Annotating cold start
27 May 2025 10:13:27,517 [INFO] (rapid) INVOKE RTDONE(status: success, produced bytes: 0, duration: 2.150000ms)
END RequestId: 9c3619b2-af72-4130-894f-e78937983e53
REPORT RequestId: 9c3619b2-af72-4130-894f-e78937983e53	Init Duration: 0.03 ms	Duration: 186.76 ms	Billed Duration: 187 ms	Memory Size: 3008 MB	Max Memory Used: 3008 MB

Metadata

Metadata

Labels

featureNew feature or functionality

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions