AWS Cloud9 で 作成した AWS Lambda 関数で kintone Webhook 通知を受信する

AWS Cloud9 で作成した Lambda 関数に、[kintone の Webhook](https://jp.cybozu.help/k/ja/user/app_settings/set_webhook/webhook.html) 通知を投げて結果を確認してみます。

AWS Cloud9 であらかじめ作成した Lambda関数(blue print)を元に進めます。
ここまでの作業は [AWS Cloud9 で AWS Lambda を開発する環境を構築してみる](https://qiita.com/sy250f/items/093405f206b551e03502) を参考にしてください。

# 前提条件

* Cloud9 環境作成済み
* CodeCommit 環境作成済み
* API Gateway 環境作成済み
* AWS Lambda 環境作成済み

# kintone Webhook の設定

作成した blue print そのままのコードの Lambda関数に、Webhook通知を投げてみます。

## Webhook 通知の設定

アプリの設定を変更する → 設定タブ → Webhook を選択します。
<img width="597" alt="スクリーンショット 2019-10-19 16.32.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4ab1b1e5-022d-3801-b8f1-bcffa9907fd5.png">

Webhookの設定値を入力します。
Webhook URL には、作成した Lambda関数に紐付けた API Gateway の エンドポイントを入力します。
<img width="886" alt="スクリーンショット 2019-10-19 16.33.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/39f8207d-2319-ad0b-c10c-afa1291247c2.png">

ステータスの更新通知を有効にしたら、プロセス管理を有効化しておきます。
<img width="808" alt="スクリーンショット 2019-10-19 16.35.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/743de684-62d9-c988-c0be-c195e96e806c.png">

アプリを更新します。

# Webhook 通知のテスト

レコードの追加、編集、削除、コメントの書き込み、ステータスの更新を順番にテストしてみます。

## レコードの追加

アプリにてレコードを新規作成して保存します。
<img width="536" alt="スクリーンショット 2019-10-19 16.42.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/ad645727-5110-3a1d-a3e4-9cddeee64a95.png">

## kintone Webhookログの確認

アプリの設定→Webhook→Webhookログでログを確認します。
<img width="1229" alt="スクリーンショット 2019-10-19 16.53.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/334b32cd-8e79-619f-dace-8b0b7f0beee2.png">

監査ログも確認します。
<img width="1239" alt="スクリーンショット 2019-10-19 16.58.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/16b40fa3-4af0-38a5-ec36-a38ac78a350e.png">

## Cloud Watch ログの確認

AWS Cloud Watch ログを確認します。
<img width="1035" alt="スクリーンショット 2019-10-19 17.20.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/20b8cae4-f2de-60f0-415a-3a5b6a80518c.png">
kintone のレコードが確認できます。

## Lambda関数

```index.js
"use strict";
let sc; // Status code
let result = "";
exports.handler = function(event, context, callback) {
    console.log(event);
    const kintonePost = JSON.parse(event.body);
    console.log(kintonePost);
    sc = 200;
    result = "kintone POST success!";
    const response = {
      statusCode: sc,
      headers: { "Content-type": "application/json" },
      body: JSON.stringify( result )
    };
   callback(null, response);
};
```

kintone Webhook で受信した POST リクエストをそのままログに出力しています。
`callback` で kintone に ステータスコードを返しています。

API Gateway で 取得した kintone の Webhook リクエストは、ハンドラ関数の event 変数に入ってきます。

kintone record の中身は event.body に入っているので、`JSON.parse` して JavaScript のオブジェクトに変換しています。

レコードの中身にアクセスするには、例えば [$id] の場合は下記になります。

`JSON.parse(record.body).kintonePost.record['$id'].value`

---

# 関連リンク

## AWS 関連

* [AWS Cloud9 Integrated Development Environment (IDE) で AWS Lambda 関数を操作する](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/lambda-functions.html)
* [AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/)
* [AWS Cloud9上で作成したLambda関数で環境変数を利用する](https://oreout.hatenablog.com/entry/cloud9/8)
* [環境変数を使用する Lambda 関数を呼び出す](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/lambda-functions.html#lambda-functions-invoke-env-vars)

## Node.js 関連

* [Request - Simplified HTTP client](https://github.com/request/request)


---