求SNS→SQS→Lambda链路下Lambda控制台测试用SQS消息示例JSON结构
未开启Raw Messaging时SNS→SQS→Lambda的测试事件结构
核心规则:未开启Raw消息投递配置时,SNS会将完整的通知结构体序列化为JSON字符串,对内部所有双引号做转义处理后,再填入SQS事件的body字段。你之前构造的测试事件不符合该格式,所以出现解析错误:
- 直接把SNS结构作为
body的JSON对象:不符合SQS事件的原生格式,SQS的body字段固定为字符串类型 - 未转义直接把SNS JSON作为字符串填入
body:JSON语法非法,内部双引号会和外层body的字符串边界冲突
正确测试JSON示例
{ "Records": [ { "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "{\"Type\" : \"Notification\", \"MessageId\" : \"84102bd5-8890-4ed5-aeba-c15fafc926dc\", \"TopicArn\" : \"arn:aws:sns:eu-west-1:534706846367:HelloWorld\", \"Message\" : \"hello World\", \"Timestamp\" : \"2012-06-05T13:44:22.360Z\", \"SignatureVersion\" : \"1\", \"Signature\" : \"Qzh0qXhijBKylaFwc9PGE+lQQDwHGWkIzCW2Ld1eVrxNfSem4yyBTgouqGX26V0m1qhFD4RQcBzE3oNqx5jFhJfV4hN45FNcsFVnmfLPGNUTmJWblSk8f6znWgTy8UtK9xrTeNYzK59k3VJ4WTJ5kCEj+2vH7sBV15fAXeCAtdQ=\", \"SigningCertURL\" : \"https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem\", \"UnsubscribeURL\" : \"https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:534706846367:HelloWorld:8a3acde2-cb0b-4a56-9b9c-b75ed7307556\"}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1523232000000", "SenderId": "123456789012", "ApproximateFirstReceiveTimestamp": "1523232000001" }, "messageAttributes": {}, "md5OfBody": "替换为对应body内容的MD5值即可", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue", "awsRegion": "us-east-1" } ] }
Lambda侧解析逻辑示例(Python)
import json def lambda_handler(event, context): for sqs_record in event['Records']: # 先解析SQS的body得到SNS通知对象 sns_notify = json.loads(sqs_record['body']) # 再取出SNS投递的业务消息做后续处理 msg_content = sns_notify['Message'] # 业务逻辑 print(msg_content)
内容的提问来源于stack exchange,提问作者sak18
相关产品推荐
相关产品推荐

