免責
本投稿は、個人の意見で、所属する企業や団体は関係ありません。
対象
はじめて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要素少な目ですみませんー