Edited at
kintoneDay 4

kintoneをAWS Lambdaでバッチ処理してみました(はじめてのキントーン)

More than 3 years have passed since last update.


免責

本投稿は、個人の意見で、所属する企業や団体は関係ありません。


対象

はじめてkintone / AWS Lambdaを触る方に向けのレベルです。


前提 & はじめに

IoTハンズオンで使われたkintoneデータがあったので、集計処理をしてみるlambdaを作ってみます。私の前提ですが、

・初めてkintoneを触ります

・nodejs初めて書きます(Lambda用)

・Qiitaへの投稿も初めてです

という状態、かつ、残り時間1日しかないぎりぎりでやってました(汗


狙い

Lambdaのスケジュールイベントでバッチ処理ができるようになったので、データ統計を日/月で統計データが作れるかなといった感じです。

IoTのデータベースで正規化しにくいDBだったのでレポート作成してみようと思った次第。

IoTの話は、ToshiakiEnamiのこのあたりの記事をご参照ください。


構成

やっぱりサーバレスでやりたいですよね!

Lambdaのみです。

元のデータ

多くのセンサー(ハンズオン受講者数分)とセンサータイプ(気温と湿度)、値、作成日時があります。


LambdaでkintoneAPI

一括のレコード取得方法、まずはまりました。 

テストで一件取得をやったがために、URIの違いに気が付かず。。

url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/record.json",

url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/records.json",

複数件取得の場合、record.json -> record[s].jsonに変わる。なまじ一件が動いてしまい、はげるほど悩む。。

queryパターンで日付などはkintoneのAPI側で関数が用意されています。便利。

kintone API getについてはこちら

今回の取得クエリ例

    request({

method: 'GET',
url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/records.json",
headers: {
'X-Cybozu-Authorization': 'hoge',
'Authorization': 'Basic hoge',
'Content-Type': 'application/json'
},
json: {
'app': APP_ID,
'query': 'SensorType = ' KIND '
'fields': ['DeviceID', 'Value', 'Datetime']
}

一括取得時には制限にお気を付けください。上記kintone apiより抜粋

一度に取得できるレコードは 500件までです。

リクエスト時にクエリで指定できる fields の添字は、0~99の範囲になります。
リクエスト時にボディで指定できる fields数は 1000個までです。


Lambda zip ケアレスミス

nodejsはzip圧縮でLambdaへ。ここでもZipの方法を間違えて悩む。

スクラッチからLambdaの利用でど忘れでした。

開発環境

kintone

├── main.js

└── node_modules

としてましたが、 kintoneの階層から zipしたために、module not found。ありがちですので、皆様気を付けてー

正しくは、 kintoneディレクトリで

zip -r kintone.zip main.js node_modules

としてzipファイル配下はフラットな構造である必要があります。

コード自体は、データソースに対して一括GET取得し、reportスペースにGETで登録とシンプルなコードです。

ここまででコードを書くのと、はまるのを含めて3時間ちょい位です。

非常に簡単です。


Lambdaスケジューラーの設定例

毎日時刻1:00(JST)に起動する例

cron(0 16 * * ? *)


振り返り

データ取得、投入は比較的容易にできました!

個人的には投入したデータをAPIでグラフ化、出力までできるようになると運用レポートが自動作成できていいのではないかなと思いました。

見落としていたらすみません、なのですが、グラフ作成、出力のAPIが欲しいですー


本当にやりたかったこと

時間があればデータは一度S3にputして、再度 Lambda起動後にreportスペースに入れたかったです。

意図としては、

・S3に残すことでバックアップ及びバルクでデータ投入が楽になる(はず)

・データ解析としてredshiftとかに用途を変更するとかフレキシビリティが上がる

かなと考えてました。

こんな感じです

kintone要素少な目ですみませんー