ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

API Gateway の Kinesis Proxy で追跡性をちょこっと上げてみる

結論

本文マッピングテンプレートを以下のようにします

#set($inputRoot = $input.path('$'))
#define ($data){"requestId": "$context.requestId","data": "$inputRoot"}#end
{
    "StreamName": "STREAM_NAME",
    "Data": "$util.base64Encode($data)",
    "PartitionKey": "KEY"
}

これでリクエストの ID がとれ、後の処理の追跡がしやすくなる…はず?
設計に応じて、ステージ名とかパスとか入れるとよさそうです。

参考にさせてもらったところ

Amazon Kinesis プロキシとして API Gateway API を作成する - Amazon API Gateway

API Gatewayへの入力値にLambdaからアクセスする - Qiita

蛇足1: ちょっとめんどくさかった Json 文字列の作成

Kinesis Proxy の DataBase64エンコードされてる必要があります。よって、先に JSON 文字列を作ってやる必要がありました。
が、このやり方がひたすら謎で迷走してました。Velocity Template Language てなんやねん…
結局は #define でできました。

Apache Velocity Engine VTL Reference

ほかに試したこと

  • #set ($data = ...) でいれてみる
    -> ダブルクォート なしのやつが出来上がる
  • さらに $data.json() とかしてみる
    -> 空文字が返ってくる
  • #set ($data = ...) の際に '"" をエスケープして追加してみる
    -> いんたーなるさーばーえらー

蛇足2:本当は X-Ray の Trace Id がほしかった

API Gateway からの応答には入っていたので、$input.param('X-Amzn-Trace-Id') と書けばとれたりするかなー、と思ったりしましたがだめでした。
これが取れると X-Ray での描画ができてさらに便利になるやん、と期待してたりしました。

参考: Amazon API Gateway および AWS X-Ray - AWS X-Ray