はじめに
先日、「IoT@Loftハンズオン スマートファクトリー IoT基盤構築プロトタイピング」というイベントに参加してきましたので、忘れないうちにポイントをメモしておきます。
なお当日の様子は、他に以下の方がQiitaに記事を投稿しています。
- IoT@Loft ハンズオン - スマートファクトリー IoT基盤構築プロトタイピング@目黒セントラルスクウェア 参加記
- AWS IoT@Loft スマートファクトリー IoT基盤構築プロトタイピング を受講したよ(2019年10月2日実施)
アーキテクチャ
今回作成するシステムのアーキテクチャは、以下のようになっています。
通常エッジ側はRaspberry Piなどを使用するのですが、今回はCloud9で代用します。
構築
それぞれのサービスを作成していきます。
作成する順番としては、末端のほうからになります。
(つないでいくため)
Cloud9
エッジデバイスの代わりですので、linuxで作成します。
ハンズオンの時間が2時間程度でしたので、自動停止を4時間で設定しました。
Greengrass
Cloud9上でGreengrassが動作するようにします。
まず、今回使用するGreengrassのグループ、および、Coreを作成します。
指定した名前でモジュールが出来上がりますので、CoreのセキュリティリソースとGreengrass Coreソフトウェアをダウンロードします。
Greengrass Coreソフトウェアのダウンロードリンクは、下のほうにスクロールしないと出てこないので注意。
ダウンロードした2つのtar.zipファイルをCloud9にアップロードします。
その後、Cloud9にGreengrass用の環境をセットアップします。詳しくはこちらを参照してください。
※今回のハンズオンでは、これらを実行するスクリプトを用意してあり、それを実行するだけでした
Cloud9再起動後、先ほどアップロードしたリソースとGreengrass Coreソフトウェアの展開を行います。
Greengrass Coreはルート「/」に展開、リソースは「/greengrass」に展開します。
準備がすべて終わったら、Greengrassを再起動します。
Elasticsearch
本番環境ではありませんのでデプロイタイプは「開発およびテスト」にし、外部からアクセスできるように「パブリックアクセス」を選択します。ただし誰でもアクセスできるようにするのは問題ですので、アクセスポリシーを「特定のIPからのドメインへのアクセスを許可」にして、自分のPCのグローバルIPアドレスからだけアクセスできるようにします。
Kinesis Firehose
Elasticsearchが作成されたら、そこに接続するKinesis Firehoseを作成します。
ちなみに、Kinesis Firehoseを使用せずに、直接IoT CoreとElasticsearchをつなぐこともできるのですが、今回は、Elasticsearch側の負荷やデータロスト時の設定が簡単な方法を選んだとのことでした。
Elasticsearchへの送信間隔などを設定し、最後にロールを設定します。
IoT Core
いよいよ、エッジとクラウドをつなぎます。
送信元は特に指定する必要が無いので、どういったデータを受け取り、どこへ送るのかを設定します。
ここでは送受信のルールとして作成します。
ルールはSQL文で設定します。
SELECT device, value, parse_time("yyyy-MM-dd'T'HH:mm:ss", timestamp) AS timestamp FROM 'data/mine/#'
ここではトピック名を「data/mine/」としています。
(後でも出てきます)
また、送信先としてKinesis Firehoseを指定します。
IoT Analytics
受け取ったデータの分析を行います。
今回はクイック作成を利用します。
トピック名は、IoT Coreでの設定に合わせます。
IoT CoreとIoT Analyticsのつなぐ設定を何もしていないように見えますが、実はこのタイミング(チャネルを作成するとき)で自動的に、IoT Core側のルールができています。(便利!)
分析用データセットの作成
作成したデータセットを選択し、集計用のSQLクエリを作成して分析用のデータセットに出力するようにします。
SELECT
timestamp,
devices['sensor1'] as sensor1,
devices['sensor2'] as sensor2,
devices['sensor3'] as sensor3,
devices['sensor4'] as sensor4
FROM (
SELECT
timestamp,
map(array_agg(device),array_agg(value)) as devices
FROM (
SELECT
device,
value,
timestamp
FROM mine_20191012_datastore
WHERE __dt >= current_date - interval '1' day
) GROUP BY timestamp
ORDER BY timestamp ASC
) WHERE devices['sensor1'] IS NOT NULL AND
devices['sensor2'] IS NOT NULL AND
devices['sensor3'] IS NOT NULL AND
devices['sensor4'] IS NOT NULL
Lambda
センサー代わりにLambdaを利用します。
クラウド側でLambdaを作成しGreengrassにデプロイします。
なお、今回はすでに作成済みをLambda関数(Python)を使用しました。
※送信するメッセージは「data/mine/sensore1」~「data/mine/sensor4」となっており、それぞれsinカーブ(異常値あり)の値となっています
Greengrassへの設定
その後、Greengrassに作成したLambda関数を指定します。
さらに、一部の設定を修正します。
また、トピック名を環境変数として設定します。
次に、Greengrassのサブスクリプションを設定します。
今回は、IoT Coreに送るメッセージと送らないメッセージをGreengrassで切り分けます。
判断はトピック名で行います。
指定したトピック名のメッセージをLambdaから受け取り、IoT Coreに送るメッセージを対象とします。
最後に、これらの設定をGreengrassにデプロイします。
IoT Coreで受け取ったメッセージは、このようになっています。
Elasticsearch(可視化)
すでに作成済みのElasticsearchで、受け取ったデータを可視化します。
可視化はKibanaを使用します。
ここではKibanaの設定は省略します。
最終的にはこんな感じに可視化できます。
QuickSight
今回のハンズオンでは、時間の関係上、省略されました。
SageMaker
Notebookを使用して、異常値の判定をSageMakerで行います。
NotebookはIoT Analyticsの「ノートブック」から作成します。
(「ノートブック」はIoT Analyticsで、そこにつながっている「ノートブックインスタンス」がSageMaker)
すでにいくつかサンプルのノートブックが用意されているので、今回は異常検出のノートブックを利用します。
ノートブックインスタンスが起動したら、ノートブックを表示します。
表示されているコードの一部を、今回のデータ用に変更します。
すると、ちゃんと今回のデータで異常値の検知ができるようになります。
SageMaker(機械学習)
同じくNotebookを使用して機械学習を行い、モデルをS3に出力します。
出力したモデルは、後ほどエッジで利用します。
機械学習用のノートブックは、先ほどのノートブックインスタンスで実行します。
またノートブックは、すでに用意されているものを使用しました。
Lambda(機械学習)
先ほどのS3に保存されたモデルを利用して、エッジ側で異常検知を行います。
ここで使用するLambda関数も、すでに用意されているものを使用しました。
Greengrassへの設定
前回と同じように、作成したLambda関数をGreengerassグループに追加します。
さらに、今回は追加したLambda関数に機械学習のリソースを追加します。
先ほど保存したS3のモデルを指定します。
次に、今回もサブスクリプションの設定行います。
今回は、センサーから異常検知のLambda関数へのルートと、異常検知のLambda関数からIoT Coreへのルートの2つを設定します。
作成できたらデプロイします。
最後に、IoT Coreのほうで、ちゃんと異常検知した場合のメッセージが届いているか確認します。
まとめ
やることがいっぱいあって大変ですが、一つ一つ意味を考えながら作成していくと、非常にわかりやすいハンズオンだったなと感じました。