在 Lambda 中解析包含 S3 事件的 SNS 事件

问题描述 投票:0回答:1

我需要多个 lambda 来订阅 s3 存储桶事件,这不受支持,因此我们的想法是引入 SNS。

流程将是 S3Event -> SNS -> (X 个 LAMBDA 消费者)

已找到设置和架构,并且使用事件类型正确触发 Lambda

SNSEvent
与`ILambdaContext。这很好。

我的问题是尝试从 SNSEvent 消息解析 S3 事件时。

foreach (var record in snsEvent.Records)
{
    var snsRecord = record.Sns;
    if (string.IsNullOrEmpty(snsRecord.Message))
    {
      logger.Error("Message is empty", record);
      throw new Exception("Message is empty");
    }

  // Object reference not set to an instance of an object.
  var s3Event = JsonSerializer.Deserialize<S3Event>(snsRecord.Message);
  logger.Info($"{s3Event.Records.FirstOrDefault()?.S3.Object.Key}", snsEvent);

  await ProcessParsedEvent(s3Event, context);
} 

空的

snsRecord.Message
不会抛出异常,但是 cloudwatch 是一个通用对象引用错误。不过我好像看不到。

我怀疑有超过 1 个不同类型的事件可能会导致解串器出现问题,所以我添加了:

var records = snsEvent.Records.Where(x => x.EventSource.ToLowerInvariant() == "aws:s3");

但是结果相同..我需要做一些具体的事情来反序列化 s3 事件吗?

c# amazon-web-services amazon-s3 aws-lambda amazon-sns
1个回答
0
投票

我现在觉得有点傻,因为最后答案是如此简单。

该问题与反序列化器的属性大小写敏感性有关。

我的解决方案是将

PropertyNameCaseInsensitive
中的
JsonSerializerOptions
添加为 true。

从这里开始,SNS 消息(包含 JSON 格式的 s3 事件消息,小写)能够正确反序列化。

  var deserializeSettings = new JsonSerializerOptions
  {
      PropertyNameCaseInsensitive = true
  };

  var s3 = JsonSerializer.Deserialize<S3Event>(s3Json, deserializeSettings);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.