Closed
Description
Using parser() to parse Event for API Gateway Lambda.
APIGatewayProxyEventModel has version as mandatory attribute
APIGatewayEventRequestContext has authorizer as mandatory attribute
These are not present in ALL Lambda events from API Gateway via Lambda Proxy integration.
What were you trying to accomplish?
Trying to parse payload as a Model according to documentation on parser
Expected Behavior
To correctly parse the API Gateway Event passed to Lambda without throwing an exception
Current Behavior
Validation exception is thrown for missing fields.
Possible Solution
class APIGatewayEventRequestContext(BaseModel):
...
authorizer: Optional[APIGatewayEventAuthorizer]
...
class APIGatewayProxyEventModel(BaseModel):
version: Optional[str]
...
Steps to Reproduce (for bugs)
import json
from aws_lambda_powertools.utilities.parser import BaseModel, envelopes
from aws_lambda_powertools.logging import Logger
from aws_lambda_powertools.utilities.parser.parser import parse
# Specify the API payload Model expected
class UserModel(BaseModel):
username: str
password1: str
password2: str
logger = Logger()
def test(event, context):
parsed_event = parse(event=event, model=UserModel, envelope=envelopes.ApiGatewayEnvelope)
response = {
"statusCode": 200,
"body": json.dumps(event.dict())
}
return response
Environment
- Powertools version used: 1.17.1
- Packaging format (Layers, PyPi): PyPi
- AWS Lambda function runtime: 3.8
- Debugging logs
[ERROR] ValidationError: 2 validation errors for APIGatewayProxyEventModel
version
field required (type=value_error.missing)
requestContext -> authorizer
field required (type=value_error.missing)
Traceback (most recent call last):
File "/var/task/handler.py", line 34, in test
parsed_event = parse(event=event, model=UserModel, envelope=envelopes.ApiGatewayEnvelope)
File "/var/task/aws_lambda_powertools/utilities/parser/parser.py", line 148, in parse
return envelope().parse(data=event, model=model)
File "/var/task/aws_lambda_powertools/utilities/parser/envelopes/apigw.py", line 30, in parse
parsed_envelope = APIGatewayProxyEventModel.parse_obj(data)
File "/var/task/pydantic/main.py", line 578, in parse_obj
return cls(**obj)
File "/var/task/pydantic/main.py", line 406, in __init__
raise validation_error