使用AWS的API网关我将api资源配置为Kinesis的PutRecords
操作的AWS代理。 API使用者向我发送了一个事件列表,我需要将这些事件转发给Kinesis流。
他们将数据发送到API网关的格式与此类似。它包含1个类型为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
。如果我将$countVal
替换为0
,则可以正常使用。
我需要使用$input.json(x)
,因为映射模板没有提供一种不同的方式来对json对象进行字符串化。
问题:
$input.json(x)
以外有没有办法在Body Mapping模板中对json对象进行字符串化?
countVal
的值?如果可以解决,问题就会得到解决。答案 0 :(得分:4)
我设法让模板工作,创建一个有效的json对象。
{
"streamName": "MemberApiAuditLog",
"Records": [
#set($inputRoot = $input.path('$.events'))
#foreach($elem in $inputRoot) {
#set($json = $input.json("$[$foreach.index]"))
"Data":"$util.base64Encode($json)",
#end
]
}
它适合我,也希望你
答案 1 :(得分:0)
您不需要在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}
如果这对您有用,请告诉我。