Skip to content

Bug: ValidationError for EventBridgeModel #6112

Closed
@tthirietdev

Description

@tthirietdev

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

Labels

bugSomething isn't workingparserParser (Pydantic) utility

Type

No type

Projects

Status

Shipped

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions