解析AWS Lambda的SNS消息对象

时间:2016-12-04 07:40:25

标签: c# aws-lambda amazon-sns

一直在使用最近发布的支持C#lambdas的SDK。我有一个Lambda A发布的SNS主题设置。一切正常。现在我有Lambda B订阅了相同的主题。当我触发Lambda时,会触发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参数,但是当我尝试将所有属性都归零时。

1 个答案:

答案 0 :(得分:2)

因此,此处的问题是AWS SDK中用于解析消息的错误。这是&#34; parseMessage&#34;方法正在做(还有一些其他领域,但这些是有问题的)。注意结局是&#34; URL&#34; (全部上限)而不是&#34; Url&#34;

  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字符串来验证这一点,以便从&#34; URL&#34;更改到&#34; Url&#34;一切都开始有效了。

我已经在GitHub上记录了一个问题。 https://github.com/aws/aws-sdk-net/issues/502

<强>更新 如果你看看GitHub问题,你会发现我遇到这个问题的原因是因为我使用了错误的库。所以不是错误,用户错误:(

拉入此库。 Amazon.Lambda.SNSEvents