【入門】AWS IoT Coreを理解するために必要な6つのポイント

AWS IoT Coreについてポイントを絞って解説した記事です。AWS IoT Coreは認証・認可やルール管理など多くのコンポーネントが含まれているため、最初は理解しづらい部分があったので情報を整理してみました。
2020.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部東京勤務の佐藤智樹です。

入社して1ヶ月ほどで、最近はIoT関連の事業に関わっています。LambdaやAPI Gatewayなどを活用した開発は入社前から試していたのですが、今はAWS IoT Coreも触り始めています。AWS IoT Coreは認証・認可やルール管理など多くのコンポーネントが含まれているため、最初は理解しづらい部分があったので整理したいと思い記事にしました。

目次

記事の目的

今回の記事は初めてAWS IoT Coreに関わる人に向けて、とりあえず動かすまでにどんな機能があるのかざっくり分かるようにした記事です。具体的には以下の6つの内容に触れます。以下の機能について知ればデータがデバイスからAWS IoT Coreを通してAWSの各種サービスに渡るまでの最低限の流れが分かるようになります。

この記事で概要を把握して詳細はAWS IoT Coreの資料を読むことを推奨します。基本的な構成自体は昔から変わらないのでAWS IoT のBlackBeltもルール周りの仕様を理解するために役立ちます。サービスの制限などは4年でかなり変わっていると思うのでそこはご注意ください。 セキュリティ周りに関してはAWS IoT におけるデバイス管理のBlackBeltを確認することをおすすめします。

もしとりあえず動かして試してみたい!という方はAWS公式のチュートリアルかmockmockというIoTのモックサービスのAWS IoT Coreにデータを送るというチュートリアルがおすすめです。特に後者の方は証明書の作成・登録やトピックの設定など外部と連携するまでの設定が一通りあるので全体像が掴めるようになります。後全部のAWS側操作がAWS CLIで行う手順になっているので画面の変更があっても影響が少ない良い手順になっています。

AWS IoT Coreとは

以下公式からの引用です。

AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。 AWS IoT Core では数十億個のデバイスと数兆件のメッセージをサポートしており、それらのメッセージを AWS エンドポイントや他のデバイスに確実かつセキュアに処理してルーティングします。AWS IoT Core を使用すれば、アプリケーションがインターネットに接続されていない場合でも、すべてのデバイスを常に追跡して通信できます。

AWS IoT Core(デバイスをクラウドに接続)| AWS

説明のままですが、外部のデバイスとクラウド側を安全に接続するためのサービスです。IoTに特化したサービスなので、IoTを扱う場合はAPI Gatewayなどではなくこちらのサービスを使用することでデバイスからAWSにアクセスする際のエンドポイントや認証処理、イベント実行などを統合的に管理することができます。かなり簡単に書くと以下の図のようなイメージです。

AWS IoT Coreは上記で書いたような機能がいくつかのコンポーネントに別れて組まれています。先にAWS IoT Coreの内部のコンポーネントをもう少し詳細にした図を記載します。今回の記事では下記の図を使ってそれぞれの機能を紹介していきます。

メッセージブローカー(プロトコル)

AWS IoT Core側でデバイスからのメッセージを受け取る際に複数のプロトコルがあります。図の赤枠の部分です。

具体的なプロトコルとしてはHTTPS、MQTT、MQTT over WebSocketがサポートされています。HTTPSの場合は特定のURL(トピック)に対してPOSTリクエストを飛ばしてデータを通知します。MQTTはAWS IoT SDKを使用することで接続できます。MQTT over WebSocketでウェブアプリの場合はマニュアルを参考に接続し、モバイルアプリの場合は使用する言語でAWS IoT Core Device SDKを使用して接続できます。(余談ですが公式のAWSサービスアイコン集だとAWS IoT ProtcolにHTTP/2のアイコンがありますが、マニュアルには記載がないです。特定のプロトコルには依存しないように選択肢を多く持たせたいという思想はあったようなので現在作成中かもしれないですね)

メッセージブローカー(トピック)

WebAPIでいうエンドポイントに当たる部分です。トピックを設定することで受信対象を識別することができます。

トピックに設定したURIに向けてデバイス側が送信を行うことでデータの受信ができます。トピックはURLと同じように「/」で階層を区切ることでトピック自体を階層的に表現することができます。コンソール画面でいうと以下のルール内の一部で設定できます。

セキュリティ&アイデンティティ

AWS IoT Coreでは、デバイスの認証情報とポリシーを管理できます。

証明書の管理自体はAWS IoTで生成することも可能ですし、独自の証明書を登録して使用することもできます。ポリシーはIAM ポリシーと同じルールで管理されます。なのでIAMの画面でもAWS IoT Coreの画面でも確認できます。AWS IoT Coreに接続した際に証明書で認証して、認可はポリシーで管理できます。証明書以外で独自の認証を行いたい場合は、AWS IoT Ruleで再度処理を振り分けたりカスタム認証を利用したりすることで構築できます。認証にはX.509証明書やAmazon Cognito、カスタム認証でJWT検証やOAuthプロバイダー呼び出しなどが使えます。詳細な認証の種類や証明書の形式などの情報はAWS IoT のセキュリティの公式ドキュメントで確認できます。

コンソール画面上では、安全性の配下の証明証で確認できます。モノに紐づく証明書を見たい場合は管理配下のモノのページから確認できます。

ルールエンジン

SQLベースの文法でトピックにきた値を整形・追記、フィルタリングしてデータの受け渡しができます。ここで取得したデータをアクションに流すことで、AWS内部の別のサービスにデータを送ることができます。

中身はSQLベースのクエリでFROM句の部分に取得するトピックを指定して、アクションに渡したい内容をSELECT句で指定できます。またトピックから取得するデータをWHERE句でフィルタリングすることなどもできます。AWS IoT BlackBeltの図が一番わかりやすかったので引用します。(古いBalckBeltの資料の方が前後にルールエンジンについて記載もありわかりやすいと思ったので古い資料を掲載しています。)

クエリの詳細については、AWS IoT SQL リファレンスでどんな処理が行えるのか確認することができます。標準的な関数が用意されていたり、今回の図では簡略化のため省いていますがトピックの部分でも関数でLambdaの呼び出しが可能です。

アクション

AWS IoT Core からAWS内部の別のサービスに繋ぐアクションを設定できます。

現在は、AWS Lambda、Amazon Kinesis、Amazon S3、Amazon SageMaker、Amazon DynamoDB、Amazon SNS、Amazon SQS、Amazon CloudWatch、AWS CloudTrail、Amazon QuickSight、Alexa Voice ServiceなどAWSサービスへの接続や外部のWebサービスにメッセージ送信ができます。それぞれのサービスを動かすためには処理に必要となるロールをアクションに対してアタッチする必要があります。

またAWS IoT Coreのトピックに対してRePublishすることもできるので、何度かRePublishを繰り返してAWS IoT Core内部だけである程度データを処理するような設計も可能です。

アクションには、通常のアクションとエラーアクションが設定できます。エラーアクションは、アクションを呼び出した際にロールの権限不足やDynamoDBで書き込んだ際にプロビジョニングされたスループットを超えた場合などに呼び出されます。エラーアクションで一部注意が必要な部分があります。簡単に書くとアクションでLambdaを呼び出した後に、Lambdaのコード内部でエラーなどが起きた場合はエラーアクションに遷移しません。エラーアクションの挙動についてはこの方の記事がわかりやすいです。(同じような検証をしようとしたらすでにやられてました…)

AWS IoTのLambda呼び出しアクションを検証してみた

コンソール画面上では、ルールの中で設定できます。

デバイスシャドウ

デバイスシャドウは、IoT Coreに接続するデバイスの現在の状態を保存したり取得する際に使います。

データの実態はJSON形式で保存されています。名前通りデバイスに対する影のようなもので、デバイスの状態(電灯のIoTであれば電気のOn・Offなど)をJSONで管理します。デバイス側とAWS側で状態を相互に伝える際にはシャドウを介してやりとりすることで、デバイスのネットワーク接続が途切れていてもデバイスの状態をAWS側で保持してネットワーク接続時にデバイスへ反映することができます。理解するには以下の記事がおすすめです。古い記事でアイコンは変わってますが大まかな概念は当時からあまり変わっていないです。

コンソール画面上では、thingに対して紐づくので、管理配下のモノの部分で確認できます。

一連の流れのまとめ

前述した6つのポイントを理解できればデバイスからAWSへデータが渡されるまでの流れを把握できます。例えば、デバイスから状態を通知しDynamoDBでシャドウと同じ状態を保存したい場合は以下のようになります。(あくまで構築例なので他のパターンでも同じようなことはできます)

  1. デバイスがトピックに向けてMQTTでパブリッシュ
  2. 証明書やポリシーで認証・認可をチェック
  3. シャドウにデータが流れてシャドウを更新
  4. デフォルトの設定でシャドウ更新時に特定のトピックへ向けてパブリッシュ
  5. トピックを対象にいれているルールクエリが起動
  6. ルールクエリに基づいてデータを抽出
  7. DynamoDBにルールクエリで抽出したデータを反映するアクションを実行

雑感

AWS IoT Coreについて調べていた中でサービス名が変更になっている?(AWS IoT→AWS IoT Core)のか色々な資料が名称中途半端に変わっていたり、昔のわかりやすい図が最新の資料からは消えていたりするので自分なりに整理してみました。最低限動かすまでの話だったので、カスタム認証サービスやジョブサービスなどあまり触れていない内容もあるので他の記事などでご確認ください。基本的な内容はある程度網羅できたかなと思います。AWS IoT Coreを新しく始める人の参考になれば幸いです。