API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?
Posted
技术标签:
【中文标题】API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?【英文标题】:What should the mapping template look like for AWS Firehose PutRecordBatch in API Gateway?API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是什么样的? 【发布时间】:2019-08-02 11:30:46 【问题描述】:我已经成功设置了一个 API,它使用 PutRecord 使用这些说明(https://aws.mannem.me/?p=1152 - 注意:它说不安全但我仍然点击了,因为我需要它)。
我正在尝试为 PutRecordBatch 设置一个 API(基本上允许一次写入多个记录),但我不断收到
"__type": "序列化异常"
根据数小时的研究,当传入的 API 调用格式与集成请求中注明的映射模板不匹配时,API 网关会引发该错误。我正在努力弄清楚如何修复我的映射模板。
这是我的映射模板:
"StreamName": "$input.path('DeliveryStreamName')",
"Records": [
#foreach($elem in $input.path('$.Records'))
"Data": "$util.base64Encode($elem.Data)",
#if($foreach.hasNext),#end
#end
]
这是我要发送的测试数据:
"DeliveryStreamName": "test",
"Records": [
"Data": "SampleDataStringToFirehose"
,
"Data": "SampleDataStringToFirehose2"
]
【问题讨论】:
【参考方案1】:太笨了,但是映射模板有一个错误:末尾有一个额外的逗号
"数据": "$util.base64Encode($elem.Data)",
这是导致问题的原因。下面是正确的版本:
"DeliveryStreamName": "$input.path('$.DeliveryStreamName')",
"Records": [
#foreach($elem in $input.path('$.Records'))
"Data": "$util.base64Encode($elem.Data)"
#if($foreach.hasNext),#end
#end
]
【讨论】:
【参考方案2】:你的例子对我帮助很大,所以我想补充它,以防万一其他人遇到我的具体情况。
在我的例子中,我需要发送一个 JSON 对象而不是一个简单的字符串,类似于:
"DeliveryStreamName": "test",
"Records": [
"Data": "foo": "bar", "count": 321
,
"Data": "foo1": "bar1", "count": 10
]
在这种情况下,我在您的示例中使用模板时发生的情况是对象以非 JSON 格式存储,不适合进一步分析。
通过对模板的简单调整,您可以存储格式正确的 JSON 对象:
"StreamName": "$input.path('DeliveryStreamName')",
"Records": [
#foreach($elem in $input.path('$.Records'))
#set($jsonPath = "$.Records[$foreach.index].Data")
"Data": "$util.base64Encode($input.json($jsonPath))"
#if($foreach.hasNext),#end
#end
]
【讨论】:
以上是关于API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS 中运行 spring boot 应用程序并且只允许通过 AWS API Gateway 访问
从 API Gateway 获取 terraform 中 AWS lambda 的端点