如何在API Gateway集成请求中为SNS Publish添加消息属性
在API Gateway集成请求中为SNS Publish添加消息属性的正确方式
我明白你现在的困扰——CLI里加SNS消息属性很顺手,但到API Gateway集成请求里就卡壳了对吧?其实问题出在SNS的API参数格式和CLI、SQS都不一样,我来给你讲两种可行的解决办法:
方法一:使用查询字符串参数
SNS的Publish API对消息属性的查询参数格式有特定要求,和你试的SQS格式不同,需要用MessageAttributes.entry.N.Name和MessageAttributes.entry.N.Value的结构,每个属性的字段要拆成独立的参数。比如添加一个String类型的属性,正确的参数应该是这样:
Message=This+is+a+test+message Subject=From+API+Gateway MessageAttributes.entry.1.Name=test_attribute_name_1 MessageAttributes.entry.1.Value.DataType=String MessageAttributes.entry.1.Value.StringValue=test_attribute_value_1
如果要加多个属性,就把N递增就行,比如MessageAttributes.entry.2.Name、MessageAttributes.entry.2.Value.DataType以此类推。
方法二:使用请求体映射模板(更推荐)
如果你的消息属性比较复杂,或者想传递JSON格式的请求体,用映射模板会更灵活。步骤如下:
- 在API Gateway的集成请求中,找到映射模板部分
- 添加对应请求的Content-Type(比如
application/json) - 编写VTL模板,把请求体的字段映射成SNS Publish需要的结构,示例模板:
{ "TopicArn": "arn:aws:sns:us-west-2:111111111111:test", "Message": "$input.body.message", "Subject": "$input.body.subject", "MessageAttributes": { "store": { "DataType": "String", "StringValue": "$input.body.store_value" }, "item_count": { "DataType": "Number", "StringValue": "$input.body.item_count" } } }
这个模板会把请求体里的字段转换成SNS能识别的消息属性结构,你可以根据自己的需求调整字段名和属性类型。
为什么你之前的尝试没成功?
- 第一种用
MessageAttribute.1.Name的格式是SQS的参数规范,SNS不认可,必须加上entry前缀 - 第二种直接传
MessageAttributes '{"store":...}'的方式,API Gateway不会自动把这个字符串解析成SNS需要的对象结构,必须通过映射模板来处理
最后别忘了给API Gateway的集成角色配置SNS:Publish的权限,不然即使参数正确也会调用失败哦!
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

