AWS IoT Coreを使ってみて便利だった点と気を付けるべきこと
AWS IoT Coreを使ってみて便利だなと思った機能や運用するときに気を付けないとなって思ったことを記載していきます。
- 証明書の管理
- デバイスのマスタ情報管理
- Topicに対する接続制限数
- IoTShadowを使ったデバイス上で実行しているプログラムの変数切り替え
証明書の管理
デバイスに割り振る証明書はデバイスの出荷時等に事前に組み込んで出荷を行いたいが、デバイスの数が多ければ一台一台に証明書の発行を手動で行うのは中々面倒です。
FleetProvisioningを利用することで、SDKでの認証処理を行うコードとAWSのルート証明書等の最低限の認証情報等をプライベートgit等を利用して配信することでデバイスの証明書自体はデバイスと AWS IoT Core間で自動で生成して配信させることができます。
デバイス証明書の情報がデバイスと AWS IoT Core間でのみ保持されるので証明書を手動で管理して外部に漏洩する等といったリスクも減らすことができると考えます。
デバイスのマスタ情報管理
デバイスの管理を行う上で、管理者が管理するデバイスの一覧情報とプログラム側で使うデバイスの情報がバラバラになると情報の更新などを行った際に2か所に変更を加えるのは手間なので一元管理できそうな方法を考えてみました。
deviceIDの設定をユニークな値(デバイスのHostNameやNIC等)に設定することで、そのdeviceIDと紐づいた補足情報をDynamoDBなどに保存し、IoTRule内で送られてきたデータに対するデバイスの管理情報(設置位置や連絡先等)の情報を紐づけて次の処理に連携させることができます。
また逆にデバイス状態をdynamoDBに紐づけて保存することで、デバイスの接続が切断された等の障害が起きた際にもDB内のデバイス状態を更新することができます。
こうすることでデバイスに関する情報が1ヶ所のDynamoDBに集約されて、稼働してるデバイスの情報などをDynamoDBから確認できるようになります。
大量のデバイスへの同時送信について
AWS IoT CoreのTopic1つに対して接続できるデバイスの数には制限があります。
(デバイスへの1秒間のPublish制限は20000メッセージ)
同じデータを大量のデバイスに纏めて送信したい場合は、
パフォーマンス的にも1つのTopicから集中して大量のデータを送信させるより
複数トピックを設定して1Topic辺りの接続数を分散した方がいいようです。
IoTShadowを使ったデバイス上で実行しているプログラムの変数切り替え
遠隔地に置くデバイスの場合、デバイス内のコードを直接書き換える作業は困難な場合があるため、変数の値を最初にIoTShadowに保存されている内容を取得し、その値をデバイス上の変数として利用することでIoTShadowを更新した際にデバイス内の処理を切り替えることができます。
メインプログラムの処理結果などに応じてデバイス側で実行されているプログラムを切り替える必要などがある場合には、デバイス側の処理はデータの送信など必要な処理のみを実装しておいて、メインプログラムで処理した結果から何かデバイス側でのアクションが必要な場合はIoTShadowの内容を更新し、デバイスはそのShadwの内容を基にまた処理を繰り返すといった実装がIoTShdowを利用することで実行できるようになります。
例)デバイス内で繰り返しているデータ取得の頻度などを AWS IoT CoreCore上から変更する場合
- デバイス側で30分に1回取得しているデータを、異常があった場合は1分に一回取得するように自動で変更する
- 変更後、異常が30分検知されなかった場合は再度取得頻度を30分に一回に変更する。
- デバイス内で繰り返しを行う制御等のsleepの値がIoTShadowに保存されている。(デフォルトは30分)
処理の流れ
- ①~⑥の流れで、デバイスからIoTコアへ送られてきた値をLambda等のメインロジックに送る
- デバイスからのデータをLambda上で処理し、センサーの値に異常が合った場合、⑦でIoTShadowの変数値を変更する(30分->1分)
- デバイスはIoTShadowからShadowの変更通知を②>①の経路で受け取り、変更された値に変数値を変更する。
- デバイス側の変数が書き換わる為、1分に一回センサーの値が①~⑥の経路で送信される
- lambda側で30分間再度異常が検知されなかった場合は、shadowの値を変更する(1分->30分)
- デバイスはIoTShadowからShadowの変更通知を②>①の経路で受け取り、変更された値に変数値を変更する。
IoTShadow等をうまく活用すれば、複数台のデバイスのロジックを一回の操作で変更できるため
デバイスの試験等を行う際に活用するととても便利かと思います。