You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:50:07