解析 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
一直在使用最近发布的支持 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