Closed
Description
Expected Behaviour
When running a lambda from an EventBridge scheduler, EventBridgeModel should be able to parse the event.
Current Behaviour
EventBridgeModel fails to parse EventBridge scheduler event because of the field detail.
For some reason, the event returned by AWS has detail
property as a string and not as a dict. I am wondering if it's because it is empty.
Exemple of the event received
{
'version': '0',
'id': '1967b367-1419-4bf0-87ee-70d64740e942',
'detail-type': 'Scheduled Event',
'source': 'aws.scheduler',
'account': '111111111111',
'time': '2025-02-17T16:43:00Z',
'region': 'eu-west-1',
'resources': ['arn:aws:scheduler:eu-west-1:111111111111:schedule/default/example-scheduler'],
'detail': '{}'
}
And the returned error
[ERROR] InvalidModelTypeError: Error: 3 validation errors for EventBridgeModel
detail.dict[str,any]
Input should be a valid dictionary [type=dict_type, input_value='{}', input_type=str]
For further information visit https://errors.pydantic.dev/2.9/v/dict_type detail.is-subclass[BaseModel]
Input should be a subclass of BaseModel [type=is_subclass_of, input_value='{}', input_type=str]
For further information visit https://errors.pydantic.dev/2.9/v/is_subclass_of detail.BaseModel
Input should be a valid dictionary or instance of BaseModel [type=model_type, input_value='{}', input_type=str]
For further information visit https://errors.pydantic.dev/2.9/v/model_type. Please ensure the Input model inherits from BaseModel,
and your payload adheres to the specified Input model structure.
Model=<class 'aws_lambda_powertools.utilities.parser.models.event_bridge.EventBridgeModel'>
Code snippet
event = {
'version': '0',
'id': '1967b367-1419-4bf0-87ee-70d64740e942',
'detail-type': 'Scheduled Event',
'source': 'aws.scheduler',
'account': '111111111111',
'time': '2025-02-17T16:43:00Z',
'region': 'eu-west-1',
'resources': ['arn:aws:scheduler:eu-west-1:111111111111:schedule/default/example-scheduler'],
'detail': '{}'
}
parse(event, model=EventBridgeModel)
# Or with an actual event bridge scheduler invoking the lambda
@event_parser(model=EventBridgeModel)
def handler(event, context: LambdaContext):
print(event)
Possible Solution
- Maybe a pre validator if type is string for
detail
property that json.loads() the value
Steps to Reproduce
- Create a lambda with a simple handler that parse
EventBridgeModel
- Create an eventbridge scheduler with a near CRON time.
- Make sure the target role has
lambda:InvokeFunction
policy - Consult CloudWatch logs
Powertools for AWS Lambda (Python) version
latest
AWS Lambda function runtime
3.12
Packaging format used
Lambda Layers
Debugging logs
Metadata
Metadata
Assignees
Type
Projects
Status
Shipped