我需要多个 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 事件吗?
我现在觉得有点傻,因为最后答案是如此简单。
该问题与反序列化器的属性大小写敏感性有关。
我的解决方案是将
PropertyNameCaseInsensitive
中的 JsonSerializerOptions
添加为 true。
从这里开始,SNS 消息(包含 JSON 格式的 s3 事件消息,小写)能够正确反序列化。
var deserializeSettings = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
var s3 = JsonSerializer.Deserialize<S3Event>(s3Json, deserializeSettings);