LoginSignup
1
0

More than 3 years have passed since last update.

「IoT@Loft ハンズオン スマートファクトリー IoT基盤構築プロトタイピング」参加メモ

Last updated at Posted at 2019-10-12

はじめに

先日、「IoT@Loftハンズオン スマートファクトリー IoT基盤構築プロトタイピング」というイベントに参加してきましたので、忘れないうちにポイントをメモしておきます。

なお当日の様子は、他に以下の方がQiitaに記事を投稿しています。

アーキテクチャ

今回作成するシステムのアーキテクチャは、以下のようになっています。
image.png

通常エッジ側はRaspberry Piなどを使用するのですが、今回はCloud9で代用します。

構築

それぞれのサービスを作成していきます。
作成する順番としては、末端のほうからになります。
(つないでいくため)

Cloud9

image.png

エッジデバイスの代わりですので、linuxで作成します。
ハンズオンの時間が2時間程度でしたので、自動停止を4時間で設定しました。
image.png

Greengrass

image.png

Cloud9上でGreengrassが動作するようにします。

まず、今回使用するGreengrassのグループ、および、Coreを作成します。
指定した名前でモジュールが出来上がりますので、CoreのセキュリティリソースとGreengrass Coreソフトウェアをダウンロードします。
image.png

Greengrass Coreソフトウェアのダウンロードリンクは、下のほうにスクロールしないと出てこないので注意。
image.png

ダウンロードした2つのtar.zipファイルをCloud9にアップロードします。
image.png

その後、Cloud9にGreengrass用の環境をセットアップします。詳しくはこちらを参照してください。
※今回のハンズオンでは、これらを実行するスクリプトを用意してあり、それを実行するだけでした

Cloud9再起動後、先ほどアップロードしたリソースとGreengrass Coreソフトウェアの展開を行います。
Greengrass Coreはルート「/」に展開、リソースは「/greengrass」に展開します。

さらに、AWS IoTの証明書をダウンロードします。
image.png

準備がすべて終わったら、Greengrassを再起動します。
image.png

Elasticsearch

image.png

本番環境ではありませんのでデプロイタイプは「開発およびテスト」にし、外部からアクセスできるように「パブリックアクセス」を選択します。ただし誰でもアクセスできるようにするのは問題ですので、アクセスポリシーを「特定のIPからのドメインへのアクセスを許可」にして、自分のPCのグローバルIPアドレスからだけアクセスできるようにします。
image.png

Kinesis Firehose

image.png

Elasticsearchが作成されたら、そこに接続するKinesis Firehoseを作成します。
ちなみに、Kinesis Firehoseを使用せずに、直接IoT CoreとElasticsearchをつなぐこともできるのですが、今回は、Elasticsearch側の負荷やデータロスト時の設定が簡単な方法を選んだとのことでした。
image.png

出力を先ほど作成したElasticsearchにします。
image.png
image.png

エラーを出力するS3のバケットは、ここで作成します。
image.png

Elasticsearchへの送信間隔などを設定し、最後にロールを設定します。
image.png

IoT Core

image.png

いよいよ、エッジとクラウドをつなぎます。

送信元は特に指定する必要が無いので、どういったデータを受け取り、どこへ送るのかを設定します。
ここでは送受信のルールとして作成します。
ルールはSQL文で設定します。

SELECT device, value, parse_time("yyyy-MM-dd'T'HH:mm:ss", timestamp) AS timestamp FROM 'data/mine/#'

ここではトピック名を「data/mine/」としています。
(後でも出てきます)

また、送信先としてKinesis Firehoseを指定します。
image.png

IoT Analytics

image.png

受け取ったデータの分析を行います。

今回はクイック作成を利用します。
トピック名は、IoT Coreでの設定に合わせます。
image.png

IoT CoreとIoT Analyticsのつなぐ設定を何もしていないように見えますが、実はこのタイミング(チャネルを作成するとき)で自動的に、IoT Core側のルールができています。(便利!)
image.png

分析用データセットの作成

作成したデータセットを選択し、集計用の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

image.png

センサー代わりにLambdaを利用します。
クラウド側でLambdaを作成しGreengrassにデプロイします。

なお、今回はすでに作成済みをLambda関数(Python)を使用しました。
image.png

※送信するメッセージは「data/mine/sensore1」~「data/mine/sensor4」となっており、それぞれsinカーブ(異常値あり)の値となっています

Greengrassへの設定

その後、Greengrassに作成したLambda関数を指定します。
image.png

さらに、一部の設定を修正します。
image.png
また、トピック名を環境変数として設定します。
image.png

次に、Greengrassのサブスクリプションを設定します。
今回は、IoT Coreに送るメッセージと送らないメッセージをGreengrassで切り分けます。
判断はトピック名で行います。

指定したトピック名のメッセージをLambdaから受け取り、IoT Coreに送るメッセージを対象とします。
image.png

最後に、これらの設定をGreengrassにデプロイします。

IoT Coreで受け取ったメッセージは、このようになっています。
image.png

Elasticsearch(可視化)

すでに作成済みのElasticsearchで、受け取ったデータを可視化します。
可視化はKibanaを使用します。
image.png

ここではKibanaの設定は省略します。
最終的にはこんな感じに可視化できます。
image.png

QuickSight

image.png

今回のハンズオンでは、時間の関係上、省略されました。

SageMaker

image.png

Notebookを使用して、異常値の判定をSageMakerで行います。
NotebookはIoT Analyticsの「ノートブック」から作成します。
(「ノートブック」はIoT Analyticsで、そこにつながっている「ノートブックインスタンス」がSageMaker)

すでにいくつかサンプルのノートブックが用意されているので、今回は異常検出のノートブックを利用します。
image.png

ノートブックインスタンスが起動したら、ノートブックを表示します。
表示されているコードの一部を、今回のデータ用に変更します。
image.png
image.png

すると、ちゃんと今回のデータで異常値の検知ができるようになります。
image.png

SageMaker(機械学習)

image.png

同じくNotebookを使用して機械学習を行い、モデルをS3に出力します。
出力したモデルは、後ほどエッジで利用します。

機械学習用のノートブックは、先ほどのノートブックインスタンスで実行します。
またノートブックは、すでに用意されているものを使用しました。

ノートブックを実行すると、S3にモデルが出力されました。
image.png

Lambda(機械学習)

image.png

先ほどのS3に保存されたモデルを利用して、エッジ側で異常検知を行います。
ここで使用するLambda関数も、すでに用意されているものを使用しました。

Greengrassへの設定

前回と同じように、作成したLambda関数をGreengerassグループに追加します。
image.png

また、前回同様に一部の設定を修正します。
image.png
image.png

さらに、今回は追加したLambda関数に機械学習のリソースを追加します。
先ほど保存したS3のモデルを指定します。
image.png

次に、今回もサブスクリプションの設定行います。
今回は、センサーから異常検知のLambda関数へのルートと、異常検知のLambda関数からIoT Coreへのルートの2つを設定します。
image.png
image.png
作成できたらデプロイします。

最後に、IoT Coreのほうで、ちゃんと異常検知した場合のメッセージが届いているか確認します。
image.png

まとめ

やることがいっぱいあって大変ですが、一つ一つ意味を考えながら作成していくと、非常にわかりやすいハンズオンだったなと感じました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0