使用AWS的API网关,我将API资源配置为KinesisPutRecords
操作的AWS代理。API消费者向我发送了一个事件列表,我需要将这些事件转发到Kinesis流。
他们向API网关发送数据的格式与此类似。它包含一个类型为Array的顶级元素。每个数组项的对象类型是一个JSON文档:
{
"events":[
{
"time":"2017-01-01T11:43:21",
"type":"ItemSelected",
"application":"iOS Build 3654"
},{
"time":"2017-01-01:11:55:32",
"type":"ItemSelected",
"application":"iOS Build 3654"
}
]
}
所需要的是将每个单独的事件分解为Kinesis记录,并将其作为base64Encoded
字符串发送给Kinesis。
使用身体映射模板,我配置了以下内容。
{
"StreamName":"MemberApiAuditLog",
"Records":[
#foreach($elem in $input.path('$.events')){
#set($countVal=$foreach.count-1)
"Data":"$util.base64Encode($input.json('$.events[$countVal]'))",
"PartitionKey":"$input.path('$.memberid')"
}
#end
]
}
我遇到的问题是,映射模板似乎对此没有问题——这段代码中的$countVal
变量:'$.events[$countVal]'
。不知怎么的,它就是认不出$countVal
。如果我用0
替换$countVal
,它工作得很好。
我需要使用$input.json(x)
,因为映射模板没有提供不同的方式来字符串化json对象。
问题:
- 除了
$input.json(x)
之外,是否有方法在Body Mapping Template中字符串化json对象?- 我尝试过JSON.stringfy(对象),但没有成功
- 如何让代码识别该表达式中
countVal
的值?如果这个问题能够得到解决,问题就会得到解决
我已经设法使模板工作,创建了一个有效的json对象。
{
"streamName": "MemberApiAuditLog",
"Records": [
#set($inputRoot = $input.path('$.events'))
#foreach($elem in $inputRoot) {
#set($json = $input.json("$[$foreach.index]"))
"Data":"$util.base64Encode($json)",
#end
]
}
它对我有效,希望你也
前面的一个例子帮助我了解了如何解决这类问题,所以我想用不同的方式提出解决方案。
我认为你的$.events[$countVal]
周围的单引号造成了问题。正确的插值需要双引号,因此拆分赋值可以使其更清晰,并避免任何转义/引用混乱或问题。
## Note the double quotes
#set($json = $input.json("$.events[$foreach.index]"))
"Data":"$util.base64Encode($json)"
VTL文档也帮助了我:
# [ { ] set [ } ] ( $ref = [ ", ' ] arg [ ", ' ] )
如果arg包含在双引号中,则解析(即插值),如果包含在单引号中,则不解析
您不需要在foreach循环中将对象转换为字符串。相反,您应该能够简单地将对象传递给base64Encode函数,该函数会自动将其转换为base64字符串。
以下映射模板生成以下输出:
{
"StreamName":"MemberApiAuditLog",
"Records":[
#foreach($elem in $input.path('$.events')){
"Data":"$util.base64Encode($elem)",
"PartitionKey":"$input.path('$.memberid')"
}
#end
]
}
输出:
{
"StreamName":"MemberApiAuditLog",
"Records":[
{
"Data":"e3RpbWU9MjAxNy0wMS0wMVQxMTo0MzoyMSwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
"PartitionKey":"my-member-id"
}
{
"Data":"e3RpbWU9MjAxNy0wMS0wMToxMTo1NTozMiwgdHlwZT1JdGVtU2VsZWN0ZWQsIGFwcGxpY2F0aW9uPWlPUyBCdWlsZCAzNjU0fQ==",
"PartitionKey":"my-member-id"
}
]
}
当你再次解码第一个base64字符串时,你应该得到这样的结果:
{time=2017-01-01T11:43:21, type=ItemSelected, application=iOS Build 3654}
请告诉我这对你是否有效。