AWS EventBridge的Detail属性为何始终为空?
核心问题:EventBridge事件结构不匹配
当你直接在EventBridge规则中配置自定义JSON作为目标输入时,这份JSON并不会直接映射到ScheduledEvent.Detail属性——AWS Lambda接收的EventBridge事件有固定的顶层结构,你的自定义数据必须放在该结构的detail字段下,否则Lambda的序列化器无法将数据正确反序列到ScheduledEvent对象中。
默认情况下,若你直接传入自定义JSON,Lambda收到的整个请求体就是{"BatchSize":10,"BatchRetries":3},而ScheduledEvent期望的是完整的EventBridge事件格式(包含source、detail-type、detail等顶层字段),因此Detail属性始终为空。
解决步骤
1. 修正EventBridge规则的输入格式
在EventBridge规则的目标配置中,需将自定义数据嵌套在detail字段内,使用完整的EventBridge事件结构,示例如下:
{ "source": "aws.events", "detail-type": "Scheduled Event", "detail": { "BatchSize": 10, "BatchRetries": 3 } }
若使用EventBridge的输入转换器(Input Transformer),可设置输入路径为$.detail,模板填写你的自定义数据,确保最终输出包含detail字段。
2. 调整Lambda处理函数参数(无需修改EB配置)
若不想改动EventBridge配置,可直接将Lambda处理函数的参数改为你的自定义Dto类,而非ScheduledEvent:
public async Task FunctionHandler(EventBridgeDetailDto eventDetail, ILambdaContext context) { // 直接使用eventDetail.BatchSize和eventDetail.BatchRetries }
这样Lambda的序列化器会直接将传入的JSON反序列为你的Dto对象,无需依赖ScheduledEvent的结构。
3. 手动反序列化Detail内容(坚持使用ScheduledEvent)
若必须使用ScheduledEvent,需注意Detail类本质是JObject的包装,无法自动映射到你的Dto属性,需手动反序列化:
public async Task FunctionHandler(ScheduledEvent scheduledEvent, ILambdaContext context) { if (scheduledEvent.Detail != null) { var detailDto = JsonSerializer.Deserialize<EventBridgeDetailDto>(scheduledEvent.Detail.ToString()); // 使用detailDto中的属性 } }
同时要确保你的EventBridgeDetailDto正确继承自Amazon.Lambda.CloudWatchEvents包中的Detail类。
内容的提问来源于stack exchange,提问作者TortillaCurtain

