AWS IoT

Overview

AWS IoTは、インターネットを介してデータ連携するセンサー等のIoTデバイスからAWSクラウドへのセキュアなデータ通信・デバイス認証や、 IoTデバイス自体のリモート管理・ファームウェアアップデート等に加え、通信データの処理、保存、分析などを提供する包括的なサービスである。

2019年1月現在、AWS IoTは以下のような分類でサービス提供されている。

AWS IoTが提供するサービス
サービス名 概要
IoT Core 数十万規模のデバイスのデータ収集・リモート制御を目的としたサービス。
AWSクラウドへのセキュア接続やデバイス認証、リクエストの受付やメッセージのルーティングを行う。
IoT Device Management (大量の)デバイスの導入、整理、監視、リモート管理、ファームアップデート、パッチ管理を行う。
IoT Device Defender デバイスの監査、アノマリー検出・アラート通知などを行う。
IoT Analytics IoTデバイスから送信されたデータを収集、処理、保存、解析、可視化するサービス。
IoT Greengrass エッジコンピューティング環境向けのサービス。AWS IoTの各種機能を
エッジコンピューティング環境で実現するためのデバイスにインストールするソフトウェアとサーバ側のサービスがある。
Amazon FreeRTOS マイクロコントローラ向けのIoTオペレーティングシステム。マイコンベースの機器をIoTデバイス化できる。
IoT 1-click AWS IoT エンタープライズボタン、SORACOM LTE-M ボタンといった
専用のデバイスからLambdaFunctionを実行するためのサービス。
IoT SiteWise Snowball Edgeなどのゲートウェイデバイスで動作するAWSクラウドへ
データをセキュアに送信するソフトウェアパッケージ。また、複数のゲートウェイから収集したデータを構造化、
ラベリングし、リアルタイムに指標を作成し、可視化するダッシュボード機能もある。
IoT Events デバイスから収集されたデータを継続的に監視し、定義したDetector Modelに従って
イベントを検出、アクションを実行するサービス。
IoT Things Graph AWS IoT Greengrassに対応したエッジデバイスで実行するアプリケーションを、
モデルを用いて視覚的に設計するUIツール。

AWS IoT Core

IoT CoreはAWS IoTの中核となるサービスで、主にデバイス間の通信やデバイスの状態管理を担当する。 IoT Coreは以下の6つのコンポーネントにより構成される。

AWS IoT Coreのコンポーネントの概要
サービス名 概要
Device Gateway MQTTプロトコル、HTTP1.1、WebSocketsを用いて(TLS1.2)、Publish、Subscribe型で通信する。また、デバイスとの間でどのくらい通信を維持するか(KeepAlive)設定する。
Identity Service(認証・認可) 証明書によるデバイスごとの認証、独自もしくはAWS IoT X.509証明書による認証。機械同士の認証になるため、証明書、秘密鍵を使用して相互認証を行う。IoTポリシーを証明書にアタッチすることできめ細やかな権限設定が可能。
Message Broker メッセージのルーティング
Rule Engine SQL文を使ったトピックのフィルタやデータ変換・拡張などを実行する。また別AWSサービスへのルーティングなども実行する
Device Shadow デバイスの状態管理、状態データの取得・保存を行う。
Registry デバイスの状態管理、状態データの取得・保存を行う。

Note

Identity Serviceでは、あるデバイスのLeakした場合、全デバイスがRevokeの影響を受ける。そのため、特定のデバイスのみRevokeできるようにする。

Note

Device Shadowは以下のような要領で状態を管理する。

  1. Thingは自身の状態をReportedとしてShadowに登録
  2. Mobileは状態をクラウド側のShadowに登録
  3. MobileはThingの状態の更新をDesiredとして登録
  4. Thingとの状態がずれている場合、クラウド側から差分(Delta)の通知を送信し要求されている状態に変更する。

AWS IoT Device Management

IoT Device Managementでは、主に(大量の)デバイスの導入、整理、監視、リモート管理、ファームアップデート、パッチ管理を行う。以下のような機能を持つ。

  • シリアルIDなどデバイス情報の一括登録(テンプレートによるメタデータ、証明書、ポリシーを一括登録)
  • デバイスのグルーピングと検索(属性やシャドウを組み合わせて対象のデバイスを検索)
  • デバイスのロギングとモニタリング(デバイスやグループ(トラブルシューティング対象等)単位でログレベルの設定が可能)
  • OTA(OverTheAir)アップデート(リリース済みのデバイスに検証済み署名を送付する等)とアップデート対象モニタリング(どのくらいファームウェアのアップデートが完了したかを監視)
  • Jobs Fleet Rollouts(デバイスへのファームのカナリアリリース(Jobs)で動的なロールアウトが行える)

AWS IoT Device Defender

Todo

IoT Device Defenderについて記述する。

AWS IoT Greengrass

インターネットに直接アクセスできないデバイスへのデータ配信等、エッジコンピューティング向けのサービス。 エッジデバイスにインストールするソフトウェアであり、クラウド上のプログラムをデバイス側へ転送し、デバイス側で実行する。 エッジコンピューティングでは主にレイテンシや帯域幅が問題になり、オフライン上での実行が必要になるケースも多いが、以下のような機能をもち、セキュアに実行できる。

[機能]

  • クラウドから配布したLambdaをローカルで実行
  • ローカルでメッセジングとLambdaのTrigger
  • データの状態と同期
  • 終端とのデバイスとの通信(MQTT)のためのプロトコルアダプタ
  • OTAアップデート
  • 機械学習のMLモデルをエッジデバイスにデプロイし、デバイス側で推論を行い、結果を活用する。

AWS IoT Analytics

データノイズのクレンジング・フィルタリング、処理変換(圧縮等)、保存、定期的な蓄積、分析バッチ処理、可視化を行うサービス。

  • AWS IoT Analytics -> Channel
  • Pipleline
  • Store Processed datastore
  • Data set
  • Advanced Analytics or Visualization

Amazon FreeRTOS

Todo

FreeRTOSについて記述する。

AWS IoT 1-Click

Todo

1-Clickについて記述する。

AWS IoT Events

Todo

IoT Eventsについて記述する。

AWS IoT Things Graph

Todo

IoT Things Graphについて記述する。

AWS IoT SiteWise

Todo

IoT SiteWiseについて記述する。

Hundson Memo

kawabataku:~/environment $ sudo pip install AWSIoTPythonSDK
Collecting AWSIoTPythonSDK
   Downloading https://files.pythonhosted.org/packages/01/6f/ee3c174d87c3cd0b9cfa8e7e0599549ea28f495be2559dcc64c6d6485973/AWSIoTPythonSDK-1.4.3.tar.gz (79kB)
     100% |████████████████████████████████| 81kB 3.5MB/s
Building wheels for collected packages: AWSIoTPythonSDK
   Running setup.py bdist_wheel for AWSIoTPythonSDK ... done
   Stored in directory: /root/.cache/pip/wheels/60/43/ee/3df322dae6a74e27af57d797beb8cf35d2b1391f09073fa189
 Successfully built AWSIoTPythonSDK
 Installing collected packages: AWSIoTPythonSDK
 Successfully installed AWSIoTPythonSDK-1.4.3
 You are using pip version 9.0.3, however version 18.1 is available.
 You should consider upgrading via the 'pip install --upgrade pip' command.
 kawabataku:~/environment $
 kawabataku:~/environment $
 kawabataku:~/environment $
 kawabataku:~/environment $ wget http://bit.ly/2QqqRqx -O dummyclient.tar.gz
 --2019-01-16 07:09:15--  http://bit.ly/2QqqRqx
 Resolving bit.ly (bit.ly)... 67.199.248.11, 67.199.248.10
 Connecting to bit.ly (bit.ly)|67.199.248.11|:80... connected.
 HTTP request sent, awaiting response... 404 Not Found
 2019-01-16 07:09:15 ERROR 404: Not Found.

 kawabataku:~/environment $ wget http://bit.ly/2QggRgx -O dummyclient.tar.gz
 --2019-01-16 07:10:03--  http://bit.ly/2QggRgx
 Resolving bit.ly (bit.ly)... 67.199.248.10, 67.199.248.11
 Connecting to bit.ly (bit.ly)|67.199.248.10|:80... connected.
 HTTP request sent, awaiting response... 301 Moved Permanently
 Location: https://s3-ap-northeast-1.amazonaws.com/awsj-iot-handson/data-collection/dummyclient.tar.gz [following]
 --2019-01-16 07:10:03--  https://s3-ap-northeast-1.amazonaws.com/awsj-iot-handson/data-collection/dummyclient.tar.gz
 Resolving s3-ap-northeast-1.amazonaws.com (s3-ap-northeast-1.amazonaws.com)... 52.219.68.84
 Connecting to s3-ap-northeast-1.amazonaws.com (s3-ap-northeast-1.amazonaws.com)|52.219.68.84|:443... connected.
 HTTP request sent, awaiting response... 200 OK
 Length: 6036 (5.9K) [application/x-gzip]
 Saving to: ‘dummyclient.tar.gz’

 dummyclient.tar.gz                 100%[=============================================================>]   5.89K  --.-KB/s    in 0s

 2019-01-16 07:10:03 (210 MB/s) - ‘dummyclient.tar.gz’ saved [6036/6036]

 kawabataku:~/environment $
 kawabataku:~/environment $
 kawabataku:~/environment $ tar -zxvf dummyclient.tar.gz
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 ./._DummyDevice
 tar: Ignoring unknown extended header keyword `LIBARCHIVE.creationtime'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/._.DS_Store
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/.DS_Store
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/._deviceMain.py
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/deviceMain.py
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/._certs
 tar: Ignoring unknown extended header keyword `LIBARCHIVE.creationtime'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/certs/
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/._dependency.py
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/dependency.py
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/._IoT_common.py
 tar: Ignoring unknown extended header keyword `LIBARCHIVE.creationtime'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/IoT_common.py
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/certs/._root.pem
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 DummyDevice/certs/root.pem
 kawabataku:~/environment $
 kawabataku:~/environment $
 kawabataku:~/environment $ ls
 dummyclient.tar.gz  DummyDevice  README.md
 kawabataku:~/environment $
 kawabataku:~/environment $
 kawabataku:~/environment $ cd DummyDevice/
 kawabataku:~/environment/DummyDevice $ ls
 certs  dependency.py  deviceMain.py  IoT_common.py
 kawabataku:~/environment/DummyDevice $ python deviceMain.py --device_name sample_iot_thing -- root_ca ./certs/root.pem --private ./certs/ccaf1d27c4-private.pem.key --endpoint a2zv4jn2dn9jft-ats.iot.us-west-2.amazonaws.com
 usage: deviceMain.py [-h] --device_name DEVICE_NAME --endpoint ENDPOINT
                      --root_ca ROOT_CA --cert CERT --private PRIVATE
 deviceMain.py: error: argument --endpoint is required
 kawabataku:~/environment/DummyDevice $ python deviceMain.py --device_name sample_iot_thing --root_ca ./certs/root.pem --private ./certs/ccaf1d27c4-private.pem.key --endpoint a2zv4jn2dn9jft-ats.iot.us-west-2.amazonaws.com
 usage: deviceMain.py [-h] --device_name DEVICE_NAME --endpoint ENDPOINT
                      --root_ca ROOT_CA --cert CERT --private PRIVATE
 deviceMain.py: error: argument --cert is required
 kawabataku:~/environment/DummyDevice $ python deviceMain.py --device_name sample_iot_thing --root_ca ./certs/root.pem --private ./certs/ccaf1d27c4-private.pem.key --endpoint a2zv4jn2dn9jft-ats.iot.us-west-2.amazonaws.com --cert ./certs/
 ccaf1d27c4-certificate.pem.crt  ccaf1d27c4-public.pem.key       root.pem
 ccaf1d27c4-private.pem.key      ._root.pem
 kawabataku:~/environment/DummyDevice $ python deviceMain.py --device_name sample_iot_thing --root_ca ./certs/root.pem --private ./certs/ccaf1d27c4-private.pem.key --endpoint a2zv4jn2dn9jft-ats.iot.us-west-2.amazonaws.com --cert ./certs/ccaf1d27c4-certificate.pem.crt
 send back state payload:{"state": {"reported": {"wait_time": 5}}}