我有一个执行某些操作的 lambda,如果成功,我会发布一个 SNS 通知来广播该事件的发生。我订阅了一个 SQS 队列,它反过来触发 Lambda 的后续操作,以实现最佳解耦。然而,
基于此文档页面我应该收到与此类似的通知:
{
"Type" : "Notification",
"MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76",
"TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
"Subject" : "Testing publish to subscribed queues",
"Message" : "Hello world!",
"Timestamp" : "2012-03-29T05:12:16.901Z",
"SignatureVersion" : "1",
"Signature" : "EXAMPLEnTrFPa3...",
"SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
"UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee"
}
我的 Lambda 函数签名对应什么类型?我目前有这个:
public string FunctionHandler(SNSEvent sns, ILambdaContext context)
但这并不对应,因为原始 SNS 通知不包含 Records 数组。
最佳解决方案是什么以及如何设置?
当 SNS 向 SQS 队列发送消息时,它将原始消息包装在 SQS 消息信封中,其中包括附加元数据,例如消息 ID、接收句柄和消息属性。
因此,当您订阅 SQS 队列到 SNS 主题,然后配置 SQS 队列来触发 Lambda 函数时, 该函数将收到 SQS 事件;它不会收到 SNS 事件。
SQS 事件将包含一系列 SQS 消息信封,每个信封的正文字段中都包含原始 SNS 消息。要在 Lambda 函数中处理 SNS 消息,您需要从 SQS 消息信封中提取消息正文。
您需要使用
SQSEvent
Nuget 包中的预定义
AWS.Lambda.SQSEvents
类。