IoTデバイスからAWSにデータを蓄積する方法(データ蓄積編)

  • 2021.04.18
  • AWS
IoTデバイスからAWSにデータを蓄積する方法(データ蓄積編)

こんにちはなおです!

今回は前回の記事の続きで引き続きIoTデバイスからAWSにデータ送信を行い、AWS内でデータ蓄積する方法を紹介します。
前回の記事ではIoTCoreを使用してPCからAWSにデータ送信を行うところまで行いました。
まだ見ていないか方は初めに前回の記事を参照ください。

IoTデバイスからAWSにデータを蓄積する方法(データ送信編)

今回の記事ではAWSに送信されたデータを実際にAWS内のストレージに蓄積します。

今回ストレージにデータ蓄積するためにIoTAnalyticsというサービスを使用します。

[スポンサーリンク]


IoTAnalyticsとは

IoTAnalyticsとはざっくり言うとIoTCoreに送信されたデータの解析、蓄積、観覧が行えるサービスになります。
(IoTCore以外のサービスからもデータを送信して処理は行えます。)

今回でいうIoTCoreのデータに対して一通りの処理が行えるサービスになります。
データ蓄積するサービスはAWS内でもいくつか存在しますが、個人的にはIoTAnalyticsが最も直感的に扱いやすいと思います。

もっと細かく言うとIoTAnalytics内にチャネル、パイプライン、データストア、データセット、ノートブックというサービスがあり、それぞれを連携させて動作します。

チャネルはIoTAnalytics内のデータの受け口のようなサービスになります。
パイプラインはチャネルとデータストアを繋ぐ間役のサービスで、データ変換などが行えます。
データストアは名前の通りストレージサービスでパイプラインから来たデータを蓄積します。
データセットはデータストアの中身を観覧できたり、CSVでローカルにダウンロードすることができるサービスです。
ノートブックは今回使用しませんが、データを統計的に細かく分析や利用する時に使用するサービスになります。
PythonのJupyterNotebookでコーディングして処理を定義、実行が行えます。

今回はチャネル、パイプライン、データストア、データセットのセットアップを行います。
その後前回と同様びPCからAWSにデータ送信し、IoTAnalyticsのデータセットにてデータ蓄積されたか確認する所まで行います。

データストアの設定

初めにデータを蓄積するためのデータストアサービスのを作成、設定を行います。
IoTAnalyticsコンソールに移動して左バーにあるデータストアをクリックした後にデータストアの作成をクリックしてください。

データストア名を入力して次へをクリックします。
タグというのはデータストアが多くなって検索する時に検索しやすいよう情報を登録するものですが、今回は不要なのでスルーします。

次に上からストレージタイプはAWSマネージドS3バケットを選択し、次にこのストアにデータを保持するでは無制限を選択して次へをクリックします。

以下は補足ですが、
S3というのはAWSのストレージサービス名になります。
S3というサービスはIoTCoreやIoTAnalyticsのように1つのサービスとして存在しているので自分でS3内にストレージを作成することができます。
もしもS3サービス内で自分でストレージ(同じ意味でバケットと呼んでいます)を作成していて、それにデータを取り入れるようにしたい場合は顧客マネージドS3バケットという項目を選択して、自分の作成したバケットを選択します。
今回は特に自分でS3バケットを作成していないので、勝手にIoTAnalyticsと紐づけたS3バケットを作成してくれるAWSマネージドS3バケットの項目を選択しました。

またバケット内のデータは保持の期間を設定することができます。
今回はずっと保持してほしいので無制限を選択しました。

 

次にデータストアに送られてくるデータ形式を選択します。
今回はJSONデータとして送信したいのでJSONを選択してデータストアの作成をクリックします。

これでデータストアが作成できました。

チャネルの設定

次にデータの受け口であるチャネルの設定を行います。

左バーのチャネルをクリックした後にチャネルの作成をクリックします。

次にチャネル名を入力し、ストレージタイプはデータストア作成時と同じAWSマネージドS3バケットと無制限を選択します。
その後、次へをクリックしましょう。

次にIoTトピックフィルタを入力します。
トピックとは前回の記事でも紹介したように送信先になります。
適当でいいので今回は「iot/iotcore」としました。

補足ですが、チャネルを作成するとIoTCoreで“ルール”と呼ばれるものが設定されます。
このルールとはある条件を満たすとある動作を自動で実行するといういわば割り込み処理みたいなものです。
今回作成されるルールはIoTCoreの指定トピックにデータが送信されたらIoTAnalyticsにそのデータを転送するというものです。
この指定トピックとはここで設定するトピック名となります。

そして次にIAMロールの新規作成をクリックします。
ロールとは復習ですがポリシー(権限をまとめたもの)とほぼ同じものです。
チャネルが行える権限を規定したポリシーを新規作成して付与させます。

ロール名を入力してロールの作成をクリックします。
そうするとIoTAnalyticsの操作で最低限必要な権限をまとめたロールが作成されます。

作成したロールを選択し、チャネルの作成をクリックします。

これでチャネルが作成されました。

パイプラインの設定

次にチャネルとデータストアの間役であるパイプラインを作成します。

左バーにあるパイプラインをクリック後、パイプラインの作成をクリックします。

パイプラインIDには任意のパイプライン名を入力して、パイプラインソースには先ほど作成したチャネルを選択します。

その後次へをクリックしましょう。

次の画面では特に設定しないため次へだけクリックします。

ちなみにこの画面は事前に送るデータの属性(カラム)を設定するというものです。
特に設定せずともJSONで指定した名前のカラムにデータは勝手に蓄積されますが、事前設定すると早くなるようです。

 

次の画面も次へだけクリックしましょう。
ここではデータの前処理を行う場合に設定を行いますが、今回は行わないのでスルーします。

次の画面では先ほど作成したデータストアを選択して、パイプラインの作成をクリックします。

以上でパイプラインが作成されました。

データセットの設定

最後にデータ観覧を行うためのデータセットの作成を行います。

左バーのデータセットからデータセットの作成をクリックします。

次の画面ではSQLの作成をクリックしましょう。

データセットとはデータストアのデータを観覧するサービスと言いました。
当然データストアからクエリを発行するなどしてデータを観覧します。
この画面ではデータを取ってくる方法を指定しているわけです。

 

次の画面では任意のデータセット名を入力し、データソースでは先ほど作成したデータストアを選択します。
その後次へをクリックしましょう。

次の画面では特に設定を変更しないのでそのまま次へをクリックしましょう。

ここはいわばデータセットで観覧する際のクエリを設定しているわけですが、とりあえず全て表示したいのでデフォルトで大丈夫です。

 

次も次へだけクリックしましょう。
この画面はデータを絞る際の設定になりますが、今回は不要です。

次でも特にいじらずに次へだけクリックしましょう。

ここではデータセットの更新スケジュールの設定が行えます。
データセットはデータストアが更新されたら勝手に更新されるわけではなく、スケジュールで自動更新設定を行うか手動で行うことで更新されます。
実運用の時はスケジュール設定が必須になります。

 

ここでも次へをクリックします。

何やら分析データを保持する期間を指定していますが、これはデータセットでクエリを発行して取得したデータをいつまでデータセット内で保持するかの設定になります。
決してデータストアのデータを何日間保持するかという設定ではないのでとりあえずデフォルトの設定で問題ないでしょう。

 

次の画面も特に設定せずにデータセットの作成をクリックしましょう。

データセットの更新を行った際に他のAWSサービスで処理を実行したいという時にルールを設定するという画面です。
例えば更新した時にメールで知らせるやらログで管理するなどですが、今回は不要です。

 

以上でデータセットの作成が行えました!!

せっかくデータセットまで作成が行えたので試しにデータストアのデータを観覧してみましょう。
まずは作成したデータセットをクリックします。

右上のアクションから今すぐ実行をクリックしましょう。
こうするとSQLクエリに記載のクエリが実行されます。
今回の場合だとdatestoreというデータストアのデータを全て取得するというクエリになります。

クエリの実行が完了すると結果のプレビューが更新されます。
今回は当然データストアにデータが存在していないので空の結果が表示されます。
ちなみに_dtカラムは初期から存在するtimestampカラムになります。

以上のように今すぐ実行をクリックするとデータセットが手動更新されます。
手動ではなく自動で更新したい場合は先ほど設定は行わなかったスケジュール設定を行う必要があります。
とりあえず今回は手動更新で行って、必要であればスケジュール設定を行いましょう。

またデータセットではSELECTクエリしか使用できませんのでご注意ください。

[スポンサーリンク]


IoTCoreのルール確認

IoTAnalyticsの設定が一通り行えました。
IoTCoreからIoTAnalyticsにデータ転送するためにチャネルの設定項目でちらっと触れましたがルールというものを設定する必要があります。

復習ですがルールとはとある条件を満たすと事前に設定した動作を行う割り込み処理のようなものです。
今回でいうとIoTCoreの指定トピックにデータが送信されたらIoTAnalyticsにデータを転送するというルールになります。
とはいうものの今回はチャネルの作成をすることで勝手にルールが設定されるので特段設定を行う必要はありませんが、確認は行います。

まずはIoTCoreコンソールでルールをクリックし、「IoTAnalytics_先ほど作成したチャネル名」という名前になっているルールをクリックします。
「IoTAnalytics_先ほど作成したチャネル名」となっているルールがチャネル作成時に自動で作成されたルールになります。

ルールの内容を確認するとルールクエリステートメントより「iot/iotcoreトピック※に送信された全データ」をアクションより「IoTAnalyticsにメッセージを送る」となっています。
※チャネル作成時に設定したトピック名になります

つまりIoTCoreに送信する際にiot/iotcoreトピック宛にデータを送信すれば勝手にIoTAnalyticsに転送してくれるというわけです。

今後、このルールを無効化したいという場合はアクションより行えます。

IoTAnalyticsにデータ蓄積

ではAWS内にデータを蓄積させたいと思います。

前回の記事で使用したpublish.pyを少し改良します。
TOPIC定数をIoTAnalyticsのチャネル作成時に設定したトピック名に変更してください。
(今回の記事通りに設定された人の場合はiot/iotcoreになります。)

publish.pyを実行するわけですが、実際にIoTCoreにデータが到着しているか確認するためにIoTCoreのテストから今回送信するトピックをサブスクライブしましょう。
(詳細は前回の記事にて)

そしてコマンドプロンプトでpublish.pyを実行してIoTCoreにHelloWorldを3回送信します。

実行後、30秒程度待ってからIoTAnalyticsの先ほど作成したデータセットから今すぐ更新をクリックしてデータを確認しましょう。(データストアにデータが蓄積するまで30秒ほどのラグがあるため)
そうするとmessegeというカラムにHello Worldが三回蓄積されていると思います。

これにてPCから送信したデータがAWS内のストレージに蓄積されたことが確認できました。
今回はPCからデータを送信しましたが、これを任意のIoTデバイスに変更すれば今回の構成のまま同じことが行えるはずです。

データダウンロード

この項目はおまけですが、ローカルにデータをダウンロードする方法を紹介します。
ダウンロードする際は作成したデータセットの左のコンテンツクリック後に、ダウンロードをクリックすることで行えます。

なおデータセットを更新した後でないと最新のデータをダウンロードすることができないのでご注意ください。

またデータを絞ってダウンロードしたい場合は詳細のSQLクエリを編集してアクションの今すぐ実行を行ってからダウンロードしましょう。

ちなみにデータセットではSELECTクエリしか使用できないので、ゴミデータが入ったから削除したいなどデータ加工を行う場合は他サービスを使用する必要があります。
(QuickSightなど)

基本的にS3は加工なしで貯めっぱなしにするためのサービスになります。

 

ではこれでIoTデバイスから送信したデータをAWS内で蓄積させる方法の紹介を終了します。
ありがとうございました。

[スポンサーリンク]


AWSカテゴリの最新記事