kintone のレコードを kintone.proxyでAWS LambdaへPOSTリクエストしてログに吐き出してみるテスト

前回はkintoneからAWS Lambdaを実行してみました。
今回は、kintoneのレコードをLambdaに渡し、それをログに出力してみます。

# 流れ

 1. kintone.proxyを利用して、レコード詳細画面からkintoneレコードをLambdaにPOSTするコードを作成
 2. LambdaにてkintoneからPOSTしたデータを取得してログに表示する
 

# kintone.poxyを利用したkintoneレコードのPOST

```javascript
(function() {
    "use strict";

    const url = 'APIエンドポイントURL';
    const method = 'POST';
    const headers = {'Content-Type' : 'application/json'};

    kintone.events.on("app.record.detail.show", function(event) {
        let myButton = document.createElement('button');
        myButton.id = 'myButton';
        myButton.innerHTML = 'Hello Ruby!!';
        myButton.onclick = function() {
            console.log(event);
            let data = event;
            kintone.proxy(url, method, headers, data, function(body, status, headers) {
                console.log(status, body);            
                if(status >= 200 && status < 300) {
                    console.log("Success");
                }else{
                    console.log("Error");
                }
            });
            return event;
        };
        kintone.app.record.getHeaderMenuSpaceElement().appendChild(myButton);
    });
})();
```
上記の場合、kintoneのレコードは eventコールバック変数にJSON形式でセットされていますので、kintone.proxyを使ってPOSTする際に、'application/json' を指定します。
kintoneレコードはkintone.proxyのdata変数にそのままセットします。

# Lambda for Ruby2.5
LambdaファンクションをRubyで書きます。

```ruby
require 'json'

def lambda_handler(event:, context:)
    # TODO implement
    print 'event["body"] =>'
    pp event["body"]
    print 'event =>'
    pp event
    print 'JSON.parse => '
    pp JSON.parse(event["body"])
    print 'context:'
    pp context 
    { statusCode: 200, body: JSON.generate('Hello from Lambda! powerd by Ruby2.5') }
end
```
LambdaにPOSTされたデータは [プロキシ統合のための Lambda 関数の出力形式](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format) の形式で渡されます。
kintoneからPOSTされたデータの中のkintoneレコードは JSONの"body" にセットされているので、JSON.parseして取り出します。

### 実行結果の確認
実行結果が CloudWatch Logs に出力されるので、確認します。

```json
"body"=>
"{\"type\":\"app.record.detail.show\",\"appId\":219,\"recordId\":1,\"record\":{\"レコード番号\":{\"type\":\"RECORD_NUMBER\",\"value\":\"1\"},\"更新者\":{\"type\":\"MODIFIER\",\"value\":{\"code\":\"20170701\",\"name\":\"アプリ管理者\"}},\"作成者\":{\"type\":\"CREATOR\",\"value\":{\"code\":\"20170701\",\"name\":\"アプリ管理者\"}},\"更新日時\":{\"type\":\"UPDATED_TIME\",\"value\":\"2019-01-12T01:04:00Z\"},\"作成日時\":{\"type\":\"CREATED_TIME\",\"value\":\"2019-01-09T13:57:00Z\"},\"text\":{\"type\":\"SINGLE_LINE_TEXT\",\"value\":\"Hello Lambda for Ruby!!\"},\"$revision\":{\"type\":\"__REVISION__\",\"value\":\"2\"},\"$id\":{\"type\":\"__ID__\",\"value\":\"1\"}}}",

JSON.parse => {"type"=>"app.record.detail.show",
"appId"=>219,
"recordId"=>1,
"record"=>
{"レコード番号"=>{"type"=>"RECORD_NUMBER", "value"=>"1"},
"更新者"=>
{"type"=>"MODIFIER", "value"=>{"code"=>"20170701", "name"=>"アプリ管理者"}},
"作成者"=>{"type"=>"CREATOR", "value"=>{"code"=>"20170701", "name"=>"アプリ管理者"}},
"更新日時"=>{"type"=>"UPDATED_TIME", "value"=>"2019-01-12T01:04:00Z"},
"作成日時"=>{"type"=>"CREATED_TIME", "value"=>"2019-01-09T13:57:00Z"},
"text"=>{"type"=>"SINGLE_LINE_TEXT", "value"=>"Hello Lambda for Ruby!!"},
"$revision"=>{"type"=>"__REVISION__", "value"=>"2"},
"$id"=>{"type"=>"__ID__", "value"=>"1"}}
```
綺麗にパースされてRubyで扱うことの出来るオブジェクトに変換されました。

次はkintoneからPOSTされたレコードの内容を使って、ThinreportsでPDF出力してみます。

### 参考リンク

- プロキシ統合のための Lambda 関数の入力形式 https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
- プロキシ統合のための Lambda 関数の出力形式 https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
- Introducing JSON https://www.json.org/index.html
- module JSON https://docs.ruby-lang.org/ja/latest/class/JSON.html
- Ruby による Lambda 関数のビルド https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-ruby.html