解析 AWS Lambda 的 SNS 消息对象

Parse SNS message object for AWS Lambda

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

所以这里的问题是 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>",

因此,当解析运行时,它找不到任何字段,因此它 returns 为空。这使得 ValidateCertUrl 方法失败。

我通过将 JSON 字符串从 "URL" 更改为 "Url" 来验证这一点,一切都开始工作了。

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

更新 如果您查看 GitHub 问题,您会明白我 运行 进入这个问题的原因是因为我使用了错误的库。所以不是错误,用户错误:(

拉入本库。 Amazon.Lambda.SNSEvents