状況
IoT機器からJSONでPOSTされてくるデータをそのまま1行1レコードでS3に保存したい。
何も考えずに API Gateway => Kinesis Streams => Kinesis Firehose => S3 に流すと1行に複数のレコードが保存されてしまう。
こういうマッピングテンプレートにすると
{
"StreamName": "MyStream",
"Data": "$util.base64Encode(${input.json('$')})",
"PartitionKey": "$input.path('$.key')"
}
こんなファイルができてしまう。
{"key":"hoge"}{"key":"fuga"}{"key":"piyo"}
欲しいファイルはこんな感じ。
{"key":"hoge"}
{"key":"fuga"}
{"key":"piyo"}
Data
に改行を含めてKinesisに送ってあげる必要がある。
解決
文字列に改行をそのまま入れてあげれば良かった。
#set($Data = $input.json('$') + "
")
{
"StreamName": "MyStream",
"Data": "$util.base64Encode($Data)",
"PartitionKey": "$input.path('$.key')"
}
ダメだったパターン
エスケープシーケンス \n
を書いても
#set($Data = $input.json('$') + "\n")
{
"StreamName": "MyStream",
"Data": "$util.base64Encode($Data)",
"PartitionKey": "$input.path('$.key')"
}
エスケープされてなかった
{"key":"hoge"}\n{"key":"fuga"}\n{"key":"piyo"}\n
メモ
API Gatewayのマッピングテンプレートを書く前に読むべきもの