CloudWatchEvents.ScheduledEvent cannot be used with EventBridge Scheduler
Dreamescaper opened this issue · 7 comments
Describe the bug
Attempting to use ScheduledEvent with EventBridge Scheduler fails due to JSON Serialization.
Regression Issue
- Select this option if this issue appears to be a regression.
Expected Behavior
I am able to use ScheduledEvent with EventBridge Scheduler.
Current Behavior
Error converting the Lambda event JSON payload to type Amazon.Lambda.CloudWatchEvents.ScheduledEvents.ScheduledEvent: The JSON value could not be converted to Amazon.Lambda.CloudWatchEvents.ScheduledEvents.Detail. Path: $.detail | LineNumber: 0 | BytePositionInLine: 339.
Additional Information/Context
Here's the event I'm receiving:
{
"version": "0",
"id": "49672d39-8c3a-4cc6-8de5-c57b0acf718f",
"detail-type": "Scheduled Event",
"source": "aws.scheduler",
"account": "12345",
"time": "2024-11-07T22:05:00Z",
"region": "eu-central-1",
"resources": [
"arn:aws:scheduler:eu-central-1:12345:schedule/default/test-schedule"
],
"detail": "{}"
}It is very-very similar to what we have in ScheduledEvent. However, "detail" here is a string, not a json object.
According to
https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html
"detail" should be a JSON object, but "{}". I have no idea why such string is allowed, or whether any other stringified JSON is possible there.
Possible Solution
Write JSON converter, which allows Detail to be string (either allow empty object string only "{}", or a full stringified JSON object - not sure).
AWS .NET SDK and/or Package version used
Amazon.Lambda.CloudWatchEvents 4.4.0
Targeted .NET Platform
.NET 8
Operating System and version
AmazonLinux
- Per AWS service event metadata,
detailis a JSON object that contains information about the event. The service generating the event determines the content of this field. It can be"{}". - Per Amazon EventBridge events detail reference,
detailis JSON object that contains information about the event. The service generating the event determines the content of this field. It is a Required field. There are no required fields in this object for Scheduled Event events.
Since the service generating the event determines the content of this field, the Detail class is correctly modeled as class without fields.
{} should be considered as an empty JSON object.
Is there any information why string "{}" is used instead of an empty object {}?
Reproducible using payload provided by customer. Unsure why in AWS service event metadata, for detail, is states A JSON object that contains information about the event. The service generating the event determines the content of this field. It can be "{}"..
Just FYI, Java Lambda event POCO class ScheduledEvent represents detail of type Map<String, Object> here. So it would essentially also fail.
@Dreamescaper In your use case, are you actually receiving "{}" instead of {} (empty JSON object)? Or are you pointing to issue in above documentation? In either case, we would need to reach out to service team for their inputs.
Thanks,
Ashish
@ashishdhingra
Yes, I'm actually receiving string "{}"
@ashishdhingra
Btw, java package had the same issue logged:
aws/aws-lambda-java-libs#479
@ashishdhingra Btw, java package had the same issue logged: aws/aws-lambda-java-libs#479
@Dreamescaper Thanks for sharing the information. I have opened ticket with Lambda team.
Internal Ticket: P170893989
@Dreamescaper Thanks for sharing the information. I have opened ticket with Lambda team.
Internal Ticket: P170893989
@Dreamescaper We have opened ticket with service team for inputs. In the meanwhile, you may use CloudWatchEvent<string> instead of CloudWatchEvents.ScheduledEvent for your use case.
Thanks,
Ashish