AWS SQS触发Lambda时参数映射为空问题排查
问题原因及解决办法
最核心的原因:SQS触发Lambda时的输入结构和直接测试不一样
你直接在AWS UI测试时,传入的JSON会被直接当作MyCommand的序列化内容解析;但用SQS做触发器时,Lambda收到的不是你发送的原始消息体,而是一个包含SQS事件元数据的包裹结构——你的实际消息内容嵌套在Records数组里每个元素的body字段中。
举个实际的SQS触发输入示例:
{ "Records": [ { "messageId": "abc123", "body": "{\"Url\": \"https://www.google.com/\", \"Email\": \"myemail@gmail.com\"}", "eventSource": "aws:sqs", // 其他元数据字段... } ] }
你的Lambda直接用MyCommand接收,会把整个上述结构去匹配MyCommand的字段——但顶层根本没有Url和Email,自然会得到null。
次要可能原因:JSON格式不标准
你测试用的JSON用了单引号',但标准JSON要求必须用双引号"。AWS UI测试时可能做了兼容处理,但如果往SQS发的是单引号格式的消息,.NET的JSON序列化器(比如System.Text.Json)会无法正确解析,导致字段值为null。
修复步骤
1. 修改Lambda的输入参数,适配SQS事件结构
要么自己定义SQS事件的对应类,要么直接用AWS SDK提供的现成类:
方法一:使用AWS官方的SQSEvent类
先安装NuGet包Amazon.Lambda.SQSEvents,然后修改函数:
using Amazon.Lambda.SQSEvents; using System.Text.Json; public string Function(SQSEvent sqsEvent, ILambdaContext context) { foreach (var record in sqsEvent.Records) { // 从record.Body里解析出你的MyCommand对象 var cmd = JsonSerializer.Deserialize<MyCommand>(record.Body); // 这里写你的业务逻辑 } return "处理完成"; }
方法二:自定义SQS事件类(不想装NuGet的话)
using System.Text.Json; using System.Collections.Generic; public class SqsEvent { public List<SqsRecord> Records { get; set; } = new(); } public class SqsRecord { public string Body { get; set; } = default!; } public string Function(SqsEvent sqsEvent, ILambdaContext context) { foreach(var record in sqsEvent.Records) { var cmd = JsonSerializer.Deserialize<MyCommand>(record.Body); // 处理逻辑 } return "完成"; }
2. 确保发送到SQS的消息是标准JSON
把单引号换成双引号:
{ "Url": "https://www.google.com/", "Email": "myemail@gmail.com" }
内容的提问来源于stack exchange,提问作者kbd
相关产品推荐
相关产品推荐

