Skip to content

Bug: ValidationError for requestContext.http.sourceIp for APIGatewayProxyEventV2Model with a port number #7288

@iBug

Description

@iBug

Expected Behaviour

Model validates without error.

Current Behaviour

[ERROR] ValidationError: 1 validation error for APIGatewayProxyEventV2Model
requestContext.http.sourceIp
  value is not a valid IPv4 or IPv6 network [type=ip_any_network, input_value='10.1.15.242:39870', input_type=str]
Traceback (most recent call last):
  File "/var/task/main.py", line 63, in lambda_main
    return apigateway_main(event, context)
  File "/opt/python/aws_lambda_powertools/middleware_factory/factory.py", line 140, in wrapper
    response = middleware()
  File "/opt/python/aws_lambda_powertools/utilities/parser/parser.py", line 116, in event_parser
    parsed_event = parse(event=event, model=model)
  File "/opt/python/aws_lambda_powertools/utilities/parser/parser.py", line 200, in parse
    return _parse_and_validate_event(data=event, adapter=adapter)
  File "/opt/python/aws_lambda_powertools/utilities/parser/functions.py", line 84, in _parse_and_validate_event
    return adapter.validate_python(data)
  File "/opt/python/pydantic/type_adapter.py", line 421, in validate_python
    return self.validator.validate_python(

To point out: sourceIp is expecting an IP or CIDR, not an IP-with-port.

Code snippet

from aws_lambda_powertools.utilities.parser import event_parser
from aws_lambda_powertools.utilities.parser.models import APIGatewayProxyEventV2Model
from aws_lambda_powertools.utilities.typing import LambdaContext


@event_parser
def lambda_main(event: APIGatewayProxyEventV2Model, context: LambdaContext):
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': "application/json",
        },
        'body': "OK",
        'isBase64Encoded': False,
    }

Possible Solution

No response

Steps to Reproduce

  • Add layer arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:22 and invoke this function through API Gateway.

  • Get a custom domain onto Cloudflare and construct a routing chain like this:

    graph LR;
    A(["client"]);
    B(Cloudflare);
    C(CloudFront);
    D(API Gateway);
    E(Lambda);
    A --> B;
    B -- "mTLS" --> C;
    C --> D;
    D --> E;
    
    Loading

    where "mTLS" represents Cloudflare's "Authenticated Origin Pull" option. Cloudflare's Origin CA needs to be uploaded to CloudFront.

Powertools for AWS Lambda (Python) version

latest

AWS Lambda function runtime

3.12

Packaging format used

Lambda Layers

Debugging logs

Metadata

Metadata

Labels

bugSomething isn't working

Type

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions