解析AWS Lambda的SNS消息对象

4

我一直在使用最近发布的支持C# lambda的SDK。我已经设置了一个SNS主题,Lambda A会发布到该主题。这一切都很顺利。现在我有Lambda B订阅了同一个主题。当我触发Lambda A时,Lambda B被触发并传递了一个JSON消息。问题是我似乎无法将JSON解析为Amazon.SimpleNotificationService.Util.Message类型。

我已经给出了这个JSON。

{
"Records": [
{
  "EventSource": "aws:sns",
  "EventVersion": "1.0",
  "EventSubscriptionArn": "arn:.......",
  "Sns": {
    "Type": "Notification",
    "MessageId": "ce4a1d7c-c50d-51ea-bfe8-4dc1078795fe",
    "TopicArn": "arn:.......",
    "Subject": null,
    "Message": "test queue",
    "Timestamp": "2016-12-04T07:05:46.709Z",
    "SignatureVersion": "1",
    "Signature": "<mysighere>",
    "SigningCertUrl": "<pem url here>",
    "UnsubscribeUrl": "<unsub url here>",
    "MessageAttributes": {}
   }
  }
 ]
}

所以我尝试编写了以下代码(其中messageText是一个“object”类型的参数,它仅提供了“Sns”节点)。

var j = Newtonsoft.Json.Linq.JObject.Parse(messageText.ToString());
var sns = jsonData["Records"][0]["Sns"];

Console.Write($"sns object: {sns}");
var message = Message.ParseMessage(sns.ToString());

但是ParseMessage调用时会抛出错误,说SigningCertUrl字段为空。我已经将JSON写出到Cloudwatch,看到所有的字段都有值。

我错在哪里?我以为Lambda序列化程序可以帮我解析Message参数,但当我尝试这样做时,所有属性都为空。


Console.Write($"sns object: {sns}"); 的输出是什么? - Mark B
它保存对象值在较大对象的 SNS 节点处......{ "Type":"Notification", "MessageId": "ce4a1d7c-c50d-51ea-bfe8-4dc1078795fe", "TopicArn": "arn:.......", "Subject": null, "Message": "测试队列", "Timestamp": "2016-12-04T07:05:46.709Z", "SignatureVersion": "1", "Signature": "<mysighere>", "SigningCertUrl": "<pem url here>", "UnsubscribeUrl": "<unsub url here>", "MessageAttributes": {} } - ToddB
1个回答

2

这里的问题是AWS SDK解析消息时出现了错误。以下是“parseMessage”方法正在执行的操作(还有其他字段,但这些是存在问题的字段)。请注意,结尾是“URL”(全大写),而不是“Url”。

  message.SigningCertURL = Message.ValidateCertUrl(func("SigningCertURL"));
  message.SubscribeURL = func("SubscribeURL");
  message.UnsubscribeURL = func("UnsubscribeURL");

以下是JSON中的内容:

"SigningCertUrl": "<pem url here>",
"UnsubscribeUrl": "<unsub url here>",

因此,当解析运行时找不到字段,因此返回null。这使得ValidateCertUrl方法失败。
我通过更新JSON字符串,将其从“URL”更改为“Url”,并且一切都开始正常工作,已经验证了这一点。
我在GitHub上记录了这个问题。 https://github.com/aws/aws-sdk-net/issues/502 更新 如果您查看GitHub问题,您会发现我遇到这个问题的原因是我使用了错误的库。所以不是bug,而是用户错误:(
请引入此库。 Amazon.Lambda.SNSEvents

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接