[物理デバイスなしでもOK] AWS IoT Core 初級ハンズオンでIoTの世界へ入門する

テクノロジーの総合格闘技ことIoTの世界に入門し、マネージドサービスを使い倒したAWSによるIoTの世界が見えてきました。
2023.03.13

こんにちは。CX事業本部のKyoです。

最近はIoT関連のプロジェクトにサーバーサイドエンジニアとして参画しています。IoTはテクノロジーの総合格闘技とも呼ばれることもあるように非常に多くの技術要素が関わってきます。

IoTの世界観の解像度を上げたいと考え、AWSから提供されているハンズオンをやってみることにしました。

ハンズオン概要

作るものの全体像はこんな感じです。

ハンズオンページより転載。

本文とは多少違う分け方にはなりますが、大きくは以下の3つのトピックから成っているように思います。

  1. デバイスとIoT Coreの接続

  2. サーバーレスアプリケーションの作成

  3. データ活用

個人的にうれしかったポイントとしては、デバイスとしてRaspberry Pi(ラズパイ)かCloud9を選択することができる内容になっています。Cloud9を選ぶことで物理デバイスを準備することなくハンズオンを始めることができます。

1. デバイスとIoT Coreの接続

  • 利用AWSサービス
    • IoT Core
      • AWS IoT Device SDK
    • Cloud9

何はともあれ、まずはAWSとデバイスを接続します。扱うデバイスは温度・湿度センサーです。

今回はCloud9上でAWS IoT Device SDK v2 for Pythonのプログラムを動かしたものをダミーデバイスとして扱いました。Cloud9なら何かあっても簡単に作り直しが効くので安心ですね(いずれはラズパイでもやってみたい)。

AWS側の接続先となるIoT Coreでは権限管理用のポリシーや証明書、モノ(デバイス)の管理設定を行いました。設定後、デバイスへ証明書をアップロードし、MQTTでの疎通確認を行いました。

疎通が確認できたらデバイスシャドウという機能を使ってAWSのマネジメントコンソールからデバイスの設定を変更します。こうあるべき、という設定をJSON形式で定義し、AWS側からデバイスに伝える形です。ここではメッセージ送信頻度を長くしてみました。

2. サーバーレスアプリケーションの作成

  • 利用AWSサービス
    • IoT Core
    • KInesis DataStream
    • API Gateway
    • Lambda
    • DynamoDB

これは私が普段の業務で触れているのに近いところで、大きく2種類のユースケースがありました。

IoT CoreからDynamoDBへデバイスのデータを流す

流れとしてはIoT Core → KInesis DataStream → Lambda → DynamoDBで、IoT Coreからのデータを取ってくる際にはIoTルールを設定します。IoTルールではKinesis DataStreamに渡すデータ(今回はデバイスのセンサーデータ)をSQLで指定するというのが印象深かったです。

手順を終えて、よしできた!となったところで、「レコードが取得できてない・・・?」という状況に陥りました。そこからKinesisとDynamoDBのメトリクスを眺めて、Lambdaのログを追って、、というトラブルシュートを行いました。結局は環境変数に不要なスペースが入っていたことに気づき、ことなきを得ました。オブザーバビリティ、大事ですね。

DynamoDBに入っているデータをクライアントサイドで可視化する

API Gatway, Lambda, DynamoDBという王道の構成でAPIを作ります。それをハンズオンの素材として用意されているHTML + JavaScriptをブラウザから呼び出してグラフを描画します。シンプルではありますが、デバイス〜アプリケーションまでが繋がった感じが良かったです。

3. データ活用

  • 利用AWSサービス
    • IoT Core
    • OpenSeach Service
    • CloudFormation
    • KInesis Firehose
    • S3

IoTでは大量のデータが生成されます。これをどう扱うか、というハンズオンでした。

ニアリアルタイムなデータの可視化

IoT Coreから得たデータをOpenSeach Serviceへ流し込み、OpenSearch ダッシュボード上でグラフを作成します。具体的には温度と湿度の時系列グラフを作ります。IoT CoreからOpenSeach Serviceへデータを流すためには、前述のIoTルールを使いました(ステートメントは違う)。なおここではCloudFormationテンプレートが用意されており、OpenSearch ダッシュボードを作ることに集中できました。

データレイク

やはりデータを貯めるならS3、それもいい塩梅に圧縮されていてほしい。ということで、KInesis Firehoseの出番です。これもIoTルールでデータを流せます。これによって日付をプレフィックスとした配下にデバイスからのデータがgzip圧縮されて格納されていきます。

おわりに

当初の狙い通りIoTの世界の大枠(クラウド側)が見えたように思います。

今回見た範囲だけでもAWSサービスが盛りだくさんで総合格闘技感を味わうことができました。また、範囲外でも、集めたデータをどのように扱っていくのか、エンドユーザーが手軽にデータにアクセスするにはネイティブアプリがあった方がいいのでは、等々の想像も広がります。

ハンズオン全部をやると3時間くらい、とそれなりのボリュームでしたが、初級編ということもあり、一つ一つはシンプルにまとまっていてよかったです(登場するAWSサービスが多いので、このボリュームもしかたない感じはあります)。中でもIoT Coreは文字通りAWSのIoTにおけるコアなサービスであると感じたので、もう少し深堀りをしていければ、と思いました。