AWS IoTで集めたデータをSalesforceに格納して分析する、といった記事は見かけたことがないので、さっそくやってみることにしました。
ちなみに、AWS IoTの特長はここに書かれている通りですが、私なりの観点でまとめると次の5点に集約されるかと思います。
- デバイス向けにSDKを提供することで、記述しなければならないコード量は最小限にできる
- 証明書によってデバイスを認証
- TLSで暗号化されたMQTTをサポート
- SQLに似た言語でルールを定義してデータのフィルタリングができ、またDynamoDBやKinesisにデータを転送できる
- デバイスに対する要求(たとえば「ファンを回転させろ!」)は、一時的にデバイスとの接続が切れていても指示できる(「デバイスシャドウ」機能)
さて、今回行った構成ですが、デバイスが1分に1回温度データを測定し、それをAWS IoTに送信します。
データは一旦Kinesisに格納されたあと、SkyOnDemandがそれを取り出し、Salesforceに格納する、といった流れになっています。
AWSの設定
AWS IoTは現在ベータ版という位置づけですが、ちゃんとブラウザ上から一連の設定をすることができるようになっています。なお、細かい手順は省いていますので、大まかな流れをつかんでいただければと思います。
1. まずはthing(デバイス)を登録します。Intel EdisonとかのちゃんとしたIoTデバイスを用意したかったのですが、とりあえずMacをデバイス代わりにします。
2. policyを作成します。認証を受けたデバイスが何ができるかを定義したものです。たとえばPublishのみ、Subscribeのみ、といった設定ができます。ここではActionにiot:*を指定してすべての操作ができるようにします。
3. certificate(証明書)を作成します。opensslとかのコマンドを打たなくても「1-Click Certificate Create」というボタンがあるので、簡単に作成することができます。作成した秘密鍵と証明書はダウンロードできますので、ダウンロードしておきます。(あとでデバイス側に入れます。)
4. 作成したcertificateは1.のthingと2.のpolicyと紐付けを行ったうえで、有効化します。(ブラウザ上でできます。画面は割愛します。)
5. 次にruleを作成します。
Choose an actionで「Send message to a real-time data stream (Kinesis)」を選択します。追加の項目が現れるので、あらかじめ作成しておいたKinesisのストリーム(データが流れるパイプみたいなもの)を選択します。
6. 最後に[Create]ボタンを押すとルールが作成されます。
これでAWS側の設定は完了です。
Salesforce側の設定
データを格納するSalesforce側の設定です。
7. センサーデータ(SensorData__c)というオブジェクトを作成し、「タイムスタンプ」と「温度」の2項目を作成します。
SkyOnDemandの設定
実は現在のSkyOnDemandにはKinesisからデータを取得するモジュールがまだありません。ここでは社内にあるベータ版のKinesisトリガーを使っています。
8. Kinesisからデータを取り出す設定はKinesisトリガーに行います。下記の設定では、5.で選択したストリームから60秒に1回データを取り出しています。
9. トリガーから呼び出されるスクリプトはこんな感じです。かなりシンプルです。
マッピングの中身もシンプルで、デバイス側から「タイムスタンプ,温度」のカンマ区切りで送られてきたデータをそれぞれ7.で作成したSaelsforceの項目にマッピングしています。
デバイス側のプログラム
最後にIoTデバイス側(今回はMac)のプログラムを作成します。
Macに温度計を付けるのは面倒なので、23行目あたりで乱数で生成しています。(実際に分ごとに10℃も温度変化があったら怖いですが。)
またこの段階で../certs/ディレクトリに3.でダウンロードした秘密鍵と証明書ファイルを配置します。
var awsIot = require('aws-iot-device-sdk'); var moment = require('moment'); //トピック名を定義 var topic = 'mac/temperature'; // デバイスを定義(今回はMac) var device = awsIot.device({ keyPath: '../certs/privatekey.pem', certPath: '../certs/cert.pem', caPath: '../certs/rootca.crt', clientId: 'mac', region: 'ap-northeast-1' }); device.on('connect', function() { console.log('AWS IoTのMessage Brokerに接続しました'); // 60秒ごとに実行 setInterval(function() { // センサーデータの取得をエミュレート var value = (Math.random() * (30 - 20) + 20).toFixed(2); // AWS IoTへのデータ送信 var record = moment().toISOString() + "," + value; device.publish(topic, record); console.log("Published Record: " + record); }, 60 * 1000); });
実行してみる
実行して30分ほど待ってみると、こんな感じでSalesforceにデータが溜まっていることが分かります。
あとはSalesforceのダッシュボードやWave Analyticsの機能を使って、分析したり可視化したりすることができますね。
まとめ
このようにAWS IoTで集めたデータをSalesforceに入れて分析・可視化するソリューションは非常に簡単に構築できます。
今回の例ではSkyOnDemandはKinesisからSalesforceにデータを流し込んでいるだけですが、
- 1日分のデータを蓄積した上で、最高気温と最低気温の1レコードを書き込むといった集計処理 や
- 一定の温度を超えたら管理者に電話をかけるといった条件分岐処理
なども容易に構築可能です。
AWS IoTもSkyOnDemandのKinesisトリガーも現在ベータ版ですので登場までもう少しお待ちいただく必要はありますが、もし具体的なアイディアがありましたらご相談いただければと思います。