LoginSignup
9
1

More than 1 year has passed since last update.

AWS IoT Analyticsで収集したデータを可視化したいんじゃ!

Last updated at Posted at 2022-11-30

AWS Advent Calendar 2022 初日
普通に書いてもアレなんで、岡山県出身なので岡山弁口調で書きます
所要時間15~20分

記事のゴールは何じゃあ!?

AWS IoT CoreへPublishされるデータを分析したいことがあったんじゃ!
じゃけぇ、AWS IoT Analyticsを使って収集したデータをQuickSightで可視化する方法をハンズオン形式で紹介するでぇ!
この記事でAWS IoT Analyticsの構築が学べるどぉ!

対象者

  • AWS IoT Analyticsに興味あるんじゃ!って方
  • すぐにでもやってみたいんじゃ!って方

各サービス概要

AWS IoT Analytics

膨大な量の IoT データの高度な分析を簡単に実行および操作できる完全マネージド型サービス

クセが強いっ!

AWS IoT Core

ユーザーのすべての IoT デバイスとアプリケーションとの間で、低レイテンシーと高スループットで安全にメッセージを送受信できる。

ぼっけぇサービスじゃ!

QuickSight

クラウドネイティブのサーバーレスビジネスインテリジェンスサービス。データ駆動型の意思決定を行える。

カタカナのクセェ!

お題

例えばな、あなたは販売している車の運行を管理している人で、いろんな車がAWSへ接続しとったとしよう
車の状態や情報をAWS IoTへ毎秒MQTT通信でデータを送っとったら分析をやりとうなるわな

  • 「いろんな車の走行距離を知りたいわー」
  • 「グラフ化して分析したいわー」

ってなるわな
そんな時、どうすんなっちゅう話や

AWS IoT Analytics使ったらええがな!

aws-iotanalytics.drawio.png

これがベストプラクティスやないか

ほな、やってみるんじゃ!

1. AWS IoT Analyticsを作るんじゃ

1.1 S3バケット用意せな

今回は顧客マネージド型ストレージAmazon S3バケットを使用するハンズオンでいくどぉ

AWS IoT Analytics に組み込みのサービスマネージド型ストレージも選択できるけぇ、
S3を使わない場合はこのセクションは読み飛ばしてもかまわんけぇの

1.1.1 AWS IoT Analyticsに入ってきた生データを保存するバケット

まずAWS IoT Analyticsに入る生データを入れるバケットを用意じゃ
バケット名はお好みで

Cursor_と_S3_bucket.png

作成完了
iot-analytics-sample20221201_-_S3_bucket.png

IoT AnalyticsからS3への権限としてバケットポリシーを設定じゃ

iot-analytics-sample20221201_-_S3_bucket.png

設定するjson

{
    "Version": "2012-10-17",
    "Id": "PolicyID01",
    "Statement": [
        {
            "Sid": "Sid01",
            "Effect": "Allow",
            "Principal": {
                "Service": "iotanalytics.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::${バケット名}",
                "arn:aws:s3:::${バケット名}/*"
            ]
        }
    ]
}

設定完了
iot-analytics-sample20221201_-_S3_bucket.png

1.1.2 AWS IoT Analyticsのパイプラインを通過したデータを保存するバケット

データストア経由で保存するS3バケットの準備をするで

S3_bucket.png

IoT AnalyticsからS3への権限としてバケットポリシーを設定じゃ
iot-analytics-datastore-sample20221201_-_S3_bucket.png

設定するjson

{
    "Version": "2012-10-17",
    "Id": "PolicyID01",
    "Statement": [
        {
            "Sid": "Sid01",
            "Effect": "Allow",
            "Principal": {
                "Service": "iotanalytics.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::${バケット名}",
                "arn:aws:s3:::${バケット名}/*"
            ]
        }
    ]
}

設定完了じゃ
iot-analytics-datastore-sample20221201_-_S3_bucket.png

1.2 チャネルを用意せな

続いては、チャネルを作成をしていくでぇ!
チャネルは、MQTTトピックからデータを収集し、未処理データメッセージをアーカイブしてから、データをパイプラインに流す機能じゃ

iotanalytics_image.png

AWSマネジメントコンソールからAWS IoT Anaylticsのチャネル作成を選択じゃ
AWS_IoT_Analytics.png

チャネル詳細

チャネル名を入力じゃ
名前はお好みで
AWS_IoT_Analytics.png

ストレージオプション選択

ストレージオプションの選択は顧客マネージド型ストレージにし

1.1.1 AWS IoT Analyticsに入ってきた生データを保存するバケット

で用意したS3バケットを設定じゃ
S3を使わないならサービスドマネージド型ストレージを選択しといてな

AWS_IoT_Analytics.png

選択したS3に対してAWS IoT Analyticsが使うアクセス権限のロールを作成する必要があるからロール名を入力せんと

AWS_IoT_Analytics.png

AWS_IoT_Analytics.png

ソース設定(オプション)

今回のハンズオンとしてはソースは使わんけど、
実稼働でIoT core経由でIoT AnalyticsにMQTTトピックのデータを流したい場合は対象トピックを設定する必要があるからソースの設定も紹介しとくで!

IoT Coreからチャネルへデバイスごとにデータ送るのに手間がかかるんで、今回はBatchPutMessage API使ってチャネルへデータ送信するやり方を後で説明するど

AWS_IoT_Analytics.png

対象トピックからメッセージが受信できるかあとで確認からメッセージを表示をクリックじゃ
AWS_IoT_Analytics.png

ここでのロール作成はAWS IoT Coreが対象のチャネルに対してデータ送信するのに必要なアクセス権限を付与してあげんといけんから忘れるなよ!
AWS_IoT_Analytics.png

新しいタブページでAWSマネージドコンソールのAWS IoT Core画面を開いて、試しに対象トピックにメッセージを送信してみるで
AWS_IoT_-_MQTT_test_client.png

AWS IoT Analyticsのソース設定画面で受信したメッセージが表示されたら成功じゃ!
AWS_IoT_Analytics.png

チャネル完成

確認画面から設定確認して作成すればチャネル完成!
AWS_IoT_Analytics.png

1.3 データストアを用意せな

パイプラインから処理されたメッセージをデータストアに保存する必要があるんで、データストアを設定するでい!

iotanalytics_image.png

AWSマネジメントコンソールからAWS IoT Anaylticsのデータストア作成を選択じゃ
AWS_IoT_Analytics.png

データストア詳細

データストアIDはお好みで

AWS_IoT_Analytics.png

ストレージタイプ設定

ストレージオプションの選択は顧客マネージド型ストレージにし

1.1.2 AWS IoT Analyticsのパイプラインを通過したデータを保存するバケット

で用意したS3バケットを設定じゃ

他のAWSサービスからも利用されることがある場合は、顧客マネージド型S3ストレージを利用するんじゃ
AWS IoT Analyticsからのみであればサービスマネージド型ストレージを利用しといてな
AWS_IoT_Analytics.png

選択したS3に対してAWS IoT Analyticsが使うアクセス権限のロールを作成する必要があるからロール名を入力せな
AWS_IoT_Analytics.png
AWS_IoT_Analytics.png

データ形式

デフォルトのJSONを設定
AWS_IoT_Analytics_と_AWS_IoT_Analytics_for_Beginners_workshop_と_「AWS_IoT_Analyticsで収集したデータを可視化したいんじゃ!」を編集_-_Qiita.png

データパーティション追加

ここはデフォルト通りで有効化せずに次じゃ
AWS_IoT_Analytics.png

データストア完成

確認画面から設定確認して作成すればデータストア完成!
AWS_IoT_Analytics.png

1.4 パイプラインを用意せな

パイプラインはメッセージをデータストアに保存する前にメッセージを処理する機能じゃ!

iotanalytics_image.png

AWSマネジメントコンソールからAWS IoT Anaylticsのパイプライン作成を選択
AWS_IoT_Analytics.png

パイプラインID, ソースをセットアップ

パイプライン名を入力し
前述で記載した
パイプラインソースはチャネル名を設定して
パイプライン出力はデータストアIDを設定じゃ

AWS_IoT_Analytics.png

メッセージ属性推論

デフォルトのまま次じゃ
AWS_IoT_Analytics.png

メッセージの強化、変換、フィルタ

デフォルトのまま、次じゃ次じゃ

AWS_IoT_Analytics.png

パイプライン完成

確認画面から設定確認して作成すればパイプライン完成!

AWS_IoT_Analytics.png

2. データセットを作るんじゃ

データストアからデータを取得するのにデータセットが必要じゃ!

iotanalytics_image.png

2.1 データをぶち込めぇ!

本来ならIoT Coreを経由してIoT Analyticsへデータ送信するのがあるべき姿じゃけど、ポチポチTopicに対してPublishするのは大変じゃ
今回はハンズオンなんで手っ取り早くSDKを利用してChannelへデータを流し込むど!

aws-いらすとや_drawio.png

Cloud9からでもできるけど、今回はローカル環境からぶち込むんじゃ
ダミーデータとして、車ごとの走行距離を30日分としてチャネルへメッセージを送信するで

※予めローカル環境にaws profileを設定しておく

sample-car.py
import boto3
from boto3.session import Session
import copy
from datetime import datetime, date, timedelta
import random
import uuid
import json

# profile_nameはIAMで作成したcredentialsのprofile名を指定
# Cloud9経由でやる場合は指定は↓はコメントアウト
session = boto3.Session(profile_name='')
iota = session.client('iotanalytics')

# Cloud9経由でやる場合は指定は↓コメント外す
# iota = boto3.client('iotanalytics')

# AWS IoT Analyticsに送信するデータ構造
DATA_TEMPLATE = {
  "timestamp": "",
  "device_id": "",
  "mileage": 0
}

# AWS IoT Analyticsのチャンネル名(自分の環境に合わせて修正)
CHANNEL_NAME="iot_analytics_channel20221201"

# 過去30日分のダミーデータを作成。
now = datetime.now()
n_days_ago = now - timedelta(days=10)
start_time = int(n_days_ago.timestamp())
end_time = int(now.timestamp())

cnt = 0
total = 0
messages = []

# 現在まで、1分ごとのデータを作成
while end_time > start_time:
  dt = datetime.fromtimestamp(start_time)
  item = copy.copy(DATA_TEMPLATE)
  item["timestamp"] = dt.strftime("%Y-%m-%d %H:%M:%S")
  item["device_id"] = 'car' + str(random.randrange(1, 100))
  item["mileage"] = random.randrange(1, 10000)

  messages.append({'messageId':str(uuid.uuid4()),'payload': json.dumps(item)})
  cnt = cnt + 1

  # batch putで送れるデータは、デフォルトだと100件まで
  # https://docs.aws.amazon.com/iotanalytics/latest/userguide/limits.html
  if cnt >= 100:
    total = total + cnt
    print("batch put:", total)
    ret = iota.batch_put_message(channelName=CHANNEL_NAME, messages=messages)
    cnt = 0
    messages = []

  start_time = start_time + 60

if cnt > 0:
  total = total + cnt
  print("batch put:", total)
  ret = iota.batch_put_message(channelName=CHANNEL_NAME, messages=messages)
# pythonファイルを置いているディレクトリ直下で実行
$ python3 sample-car.py

2.2 データセット作るんじゃ

データに対してクエリを実行するためにデータセットを作成するでぇ!

AWSマネジメントコンソールからAWS IoT Anaylticsのデータセット作成を選択
AWS_IoT_Analytics.png

タイプ選択

今回はSQLを利用するんで「SQLを作成」を選択するど
AWS_IoT_Analytics.png

データセット設定の詳細

データセット名の入力と作成したデータストアを指定じゃ
AWS_IoT_Analytics.png

SQLクエリ作成

Pythonからチャネルへ流した車それぞれのメッセージデータに走行距離の平均値、最小値、最大値を検索できるようにSQL文を設定しておくんじゃ

テストクエリを実行して、実際にクエリ結果が返るか確認しとく
AWS_IoT_Analytics.png

SQL文
SELECT date_trunc('hour', date_parse(timestamp, '%Y-%m-%d %H:%i:%S')) as dt_hour,
device_id,
avg(mileage) as mile_avg,
min(mileage) as mile_min,
max(mileage) as mile_max
FROM iot_analytics_datestore20221201
GROUP BY 1, 2

データ選択フィルタの設定

デフォルトのまま次じゃ
AWS_IoT_Analytics.png

クエリスケジュールの設定

デフォルトのまま、次じゃ次じゃ
AWS_IoT_Analytics_と_「AWS_IoT_Analyticsで収集したデータを可視化したいんじゃ!」を編集_-_Qiita.png

データセット結果の設定

ここも次じゃ次じゃ
AWS_IoT_Analytics.png

コンテンツ配信ルールの設定

次!次!
AWS_IoT_Analytics.png

データセット完成

確認画面から設定確認して作成すればデータセット完成!

AWS_IoT_Analytics.png

データセット動作確認

今すぐ実行をやると、設定したSQLでクエリが実行されるど!
AWS_IoT_Analytics.png
コンテンツから作成されたコンテンツが確認できよる
AWS_IoT_Analytics.png

3. Amazon QuickSightを作るんじゃ

あと少しで終わるで

タイトルに書いた通りIoT Analyticsで収集したデータを可視化するでぇ!

iotanalytics_image.png

3.1 IoT Analyticsのデータを取り込むどぉ!

AWSマネージドコンソールのQuickSight画面を開くんじゃ!
※事前にQuickSightのアカウントは作成済み

セキュリティとアクセス権限

QuickSightからAWS IoT Analyticsに対してアクセス許可する必要があるけぇ設定忘れんなよ!
Admin.png

データセット作成

左のメニューにデータセットがあるけぇ、そこから「新しいデータセット」を作成じゃ
Home.png
対象のデータセットはAWS IoT Analyticsせなおえまぁ!
New_Data_Set.png

QuickSightのデータソース名を入力して、前半で作成したAWS IoT Analyticsのデータセットを選択するんじゃ
New_Data_Set.png

データセット完成

これでデータセット完成できて「視覚化する」にいくとグラフ作成できるようになるで
New_Data_Set.png

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3232373133332f38313362316639652d653861612d626536632d313137372d3865336131623161653035302e706e67.png

3.2 いよいよ、グラフ作るどぉ!

今回は複数の車の走行距離データを送信したからフィールドリストにグラフ化したい項目が選べるようになるでぇ!
例だと時間ごとの全車台数の走行距離を表すグラフになっとる
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3232373133332f33353864316362632d333836302d396464372d326163662d6633653863376133623465622e706e67.png

「フィルター」を選択すると特定の車だけ情報を視覚化させたいってんなら絞り込みも可能じゃ!
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3232373133332f32313832663837642d613136352d363739372d353237302d6432303030303264376566622e706e67.png

「ビジュアルタイプ」から、棒グラフ・円グラフなどグラフUIの表示も選べるでぇ!
iot_analytics_dataset20221201_analysis.png

おわりじゃあ!

作ったんなら、リソース消せぇ!

放ったらかしにしとると料金発生するけぇの
ちゃんと削除しとかなおえまぁ!

削除するリソース

  • QuickSight
  • AWS IoT Analytics
    • Channel
    • Pipeline
    • Datastore
    • Dateset
  • S3削除
    • バケット内のオブジェクトすべて
    • バケット
  • IAM Role

まとめ

AWS IoT Anaytics, QuickSightの利用料金もあるから実運用は参考にするとええでぇ

今回はAWS IoT Analytics ハンズオンを参考にしたけぇ、Channelへのデータ送信をCloud9でやりたい人は見とくとええでぇ

AWS IoTは、わやおもろいどぉ
AWSを登録すると12ヶ月までは無料利用枠もあるけぇ試しにやってみられぇ!

ps. 時間あるときは岡山においでんせぇ!

9
1
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
9
1