Amazon API GatewayにPOSTされたJSONに改行を入れてAmazon Kinesisに送る


状況

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のマッピングテンプレートを書く前に読むべきもの