Amazon Web Services ブログ

デバイスから AWS IoT Core や Amazon Kinesis にデータを取り込む際のベストプラクティス

モノのインターネット (IoT) のデバイスは、クラウド上でトレンドの特定や意思決定に利用できるデータを生み出します。
スケーラブルなデータ取り込み機構を設計するのは複雑な作業であり、最初のステップはデバイスの期待動作を把握することです。つまりデバイスが、どうやってデータを送信しているか、どれくらいのデータ量か、データーフローのパターンは何か、その方向はどちらか、何の目的でどういったデータが行き交うのか、を把握します。これらの質問はデータ取り込みプロセスを定義する上で欠かせません。この記事では AWS IoT Core や Amazon Kinesis を使って、大規模にデータを取り込む際の各ユースケースにおけるベストプラクティスを確認していきます。

AWS に IoT データを取り込むために、AWS の 2 大サービスを確認していきます。AWS IoT はフルマネージドサービスのスイートを提供しており、数 10 億の IoT デバイスとクラウド間の接続や、管理、そしてセキュアな通信を可能にします。また IoT アプリケーションのビルドやデプロイ、スケール化するのに役立つ機能も提供します。AWS IoT Core は数 10 億のデバイスとの接続と、数兆件のメッセージ処理をサポートします。AWS IoT Core を使う事で、メッセージを AWS エンドポイントや他のデバイスへ安全にルーティングする事ができ、IoT ソリューションの管理と制御のレイヤーを確立する事が出来ます。
Amazon Kinesis はあらゆる規模でストリーミングデータをコスト効率良く処理および分析する事が出来ます。Amazon Kinesis を使う事で、ビデオやオーディオ、アプリケーションログ、ウェブサイトのクリックストリーム、IoT テレメトリデータといったリアルタイムデータを取り込む事が出来ます。Amazon Kinesis Data Streams はスケーラブルかつコスト効率に優れたストリーミングデータサービスです。様々なデータソースからリアルタイムでデータを取り込み、ダッシュボードや異常検知、ダイナミックプライシングといったアプリケーションの即時分析を可能にします。
IoT デバイスを運用する際には、その環境やアクティビティ、シチュエーションを把握して、最適なデータ取り込みが行えるアーキテクチャを選択する必要があります。この記事では最も最適な取り込み戦略を定義するために、複数の観点とトレードオフを紹介していきます。

どういった環境か?
ここでの環境とは、利用されるデバイスや、デプロイされるソフトウェアスタック、運用目標、そしてデバイスが持つ接続性能を指します。

運用するデバイス数は?デバイスはどこで稼働するのか?どういった機能か?運用におけるデバイス上に必要な機能は?
最初に考慮すべき要素は、運用するデバイスの数と、その場所と稼働目的です。様々な環境に配置されるデバイスを遠隔で運用するには、デバイスのライフサイクルをビルトインで管理し、現在の状態を可視化する必要があります。フィールドで稼働しリモートかつ制限のあるデバイスを大量に運用管理するには、AWS IoT Core を利用できます。AWS IoT Core は、デバイスとの暗号化された情報交換をサポートし、各種情報の取得や、リモートアクションの実行を可能にします。大量のデータを頻繁に送信するが、一方でデータは受信しない様なデバイスの場合は、Amazon Kinesis を使ってデータを取り込むのが良いでしょう。データ取り込み機能を組み込む場合は Amazon Kinesis Producder Library が利用できます。また Kinesis Agent を使う事でデータの収集と Kinesis Data Streams への送信を行えます。

利用するソフトウェアスタックは何か?
デバイスの選択と開発ツール、プログラミング言語の経験や好みによって、データ取り込みレイヤーを構築するために使用するソフトウェアが決まります。マイクロコントローラー (MCU) のようなリソースが限られたデバイスは、FreeRTOS のような専用オペレーティングシステムや、データを送信するアプリケーションを構築するために AWS IoT Core でサポートされている MQTT のような軽量メッセージングプロトコルを採用するのが良いでしょう。
データ取り込みクライアントを既存のアプリケーションやエコシステムに統合する際に、汎用プロセッサ (MPU) の様なオペレーティングシステムやツールに幅広い選択肢がある場合は、Amazon Kinesis Producer Library と Kinesis Client Library を使用して、データプロデューサーとデータコンシューマーを構築できます。

何を目的としているのか?
データソース、ボリューム、フローを理解することで、最適なデータ取り込みアプローチが決まります。

取り込まれるデータ量とその頻度は?データフローのパターンは何か?
高スループット (512KB/s 以上) でデータを生成するデバイスの場合、接続毎のスループットを意識する必要があります。Kinesis Data Streams は一方向データをリアルタイムに収集・処理するのに役立ち、サーバーレスとして提供されるためスケールも可能です。
メッセージングのペイロードサイズが 128KB まで場合、AWS IoT Core がサポートする軽量メッセージングプロトコル の MQTT を使ってデータを送受信できます。一方向通信から、デバイスをリモート管理するための双方向 / コマンド・アンド・コントロール・アプローチまで、幅広い通信アプローチをサポートしています。1MB までのペイロードサイズであれば、Kinesis Data Streams を使用して AWS にデータを取り込むことができ、シャードを必要に応じて追加削除することで、読み取りと書き込みのスループットをスケーリングできます。シャードとは、ストリーム内で一意に識別されるデータレコードのシーケンスであり、ストリームは 1 つ以上のシャードで構成されます。

取り込みプロトコルは何か?
通信プロトコルの選択はデータフローやデータの性質に影響されます。双方向通信、特に断続的なデータ接続やオフラインモードをサポートする場合、AWS IoT Core が サポートする MQTT であれば HTTPS と比較してオーバヘッドが低いので要件を満たせます。データ集約型の IoT アプリケーションでは、AWS IoT Core の MQTT over WebSocket を検討できます。これはデータ送受信に TCP セッションを再利用する事でオーバーヘッドをさらに削減します。一方向通信の場合は、AWS IoT Core と Kinesis Data Streams は HTTPS をサポートしており、こちらもアプリケーションの目的に応じて選択します。

取り込むデータの用途は?
IoT デバイスによって生成されたデータは主に二つの用途、すなわちメトリクスと処理に使われます。メトリクスとは、デバイスまたはその動作を分析するコンポーネントによって生成される統計データのことです。処理とは、デバイスまたは連携するアプリケーションからのデータを取り込み、変換、クラウドに展開することです。デバイスフリートがアクションを実行するために、デバイス間でメトリクスを交換する必要があるかもしれません。このような場合、AWS IoT Core の MQTT を使用して通信チャネルを確立することが出来ます。デバイスの動作を分析し洞察を得るためのデータは、AWS IoT Core と AWS IoT Analytics を利用して、時間ベースのデータを変換、集計、照会する事ができます。データウェアハウスやデータレイクのような、データプロデューサー側から分離されて、他のデータソリューションに接続して処理されるデータは、永続化とデータ連携のために Kinesis Data Streams を使用する事が出来ます。

あなたのケースは?
大量のデバイスを管理するには、リソースとデータへのアクセスを制御するセキュリティ定義が必要です。
アクセスや可視化のレベルをデバイス上で強制させることも出来ますが、まずはデプロイや運用の観点で定義すべきです。

必要なセキュリティは何か?デバイスはどのように AWS と通信する必要があるか?
デバイスが物理的正しく扱われる事が期待できない様な環境では、固有のデバイス証明書とロールに基づいて認証・認可を定義することができます。AWS IoT Core は各デバイスを一意に認証・認可するために、X.509 証明書をサポートしています。AWS IoT Core にはマネージドな認証局 (CA) があり、独自の CA をインポートする事も出来ます。
すべてのデバイスが正しく扱われ、ベースとなるプラットフォームに直接アクセスできる様な管理された環境では、AWS 認証情報に基づいて認証・認可を実装できます。Kinesis Data Streams は AWS 認証情報でアクセス出来るので、短時間の一時認証情報を使用する事で、セキュリティ制御を強化できます。

デバイスが必要とするアクセスレベルは?
デバイスは、クラウドまたは他のデバイスによって生成された、データの一部と連携する必要があるかもしれません。AWS IoT Core は、デバイスを識別し、特定の MQTT トピックへのアクセス制御を細かく設定が出来ます。単独でデータを生成して、大量にデータを送信する一方向通信の場合、Amazon Kinesis は複数のデータプロデューサーから書き込める単一のストリームを提供します。
この場合、どのデータプロデューサーも同じストリームにデータを書き込むことができ、どのデータコンシューマーもそのデータを読むことが出来ます。

一緒に確認してみましょう
ここでは高頻度にデータを取り込みつつ可視化を行う、二つのアプローチが必要なユースケースを確認していきます。

ユースケース 1: 複数デバイスで生成されるデータの処理と可視化

何千台ものデバイスがフィールドに散らばっているとしましょう。各デバイスは少量の運用メトリクスを生成します。全体の稼働状況の把握、異常検知、予知保全、過去データの分析、これらを行うには全てのデバイスを制御し、データを集約してリアルタイムまたはバッチで洞察を得る必要があります。AWS IoT Core はデバイスの通信、管理、認可・認証を提供し、Kinesis Data Streams は高頻度データの取り込み機能を提供します。
Amazon Kinesis と連携した AWS IoT Core にデータをパブリッシュする事で、データ収集、データ処理、データ分析を広帯域でリアルタイムに行う事が出来ます。
Amazon Kinesis Data Analytics for Apache Flink を使用すると、Java、Scala、または SQL を使用してストリーミングデータを処理および分析できます。このサービスは、IoT データに対してコード実行、時系列分析、リアルタイムダッシュボードへのデータ連携や、リアルタイムメトリクスの作成を行うことができます。
レポート作成には、Amazon QuickSight をバッチダッシュボードやスケジュールダッシュボードに使用できます。よりリアルタイムなダッシュボード機能が必要な場合は、Amazon OpenSearchOpenSearch Dashboards を使用できます。

ユースケース 2: IoT デバイスからの高スループットデータの制御とストリーミング

AWS IoT と Amazon Kinesis の両サービスを組み合わせるもう一つのユースケースは、細かいデバイス制御が必要な高スループット要件です。
タービンや LiDAR データの様に、クラウドで処理するデータを大量に生成するデバイスを制御するために、デバイスとの通信と管理、認証・認可を提供する AWS IoT Core と、高スループットでデータを取り込める Amazon Kinesis Video Streams を利用できます。
上記の図では、ハードコードされた AWS アクセスキーペアを使う代わりに AWS IoT Core を利用する事で、X.509 証明書によってセキュアにデバイスをプロビジョニングし、Amazon Kinesis Video Streams を利用する事で、ビデオデータをクラウドに送信しています。

まとめ
IoT デバイスから大規模にデータを取り込むには、ユースケースやペイロードサイズ、目的、デバイスの制約に基づいて、使用するテクノロジーを選択する必要があります。以下のデシジョンマトリックスは、大規模にデータを取り込む際に適した、AWS サービスを選択するガイダンスを提供しています。特定のユースケースによっては、複数のサービスを組み合わせることもできます。

最適

AWS IoT Amazon Kinesis
デバイスへのコマンドと制御 最適  
リソースが限られたデバイス 最適  
高スループットデータ   最適
双方向通信 最適  
細かいアクセス制御 最適  

IoT デバイスにおけるデプロイの一般的な観点を確認し、各々のケースに応じた質問とベストプラクティスを紹介しました。詳細については、Amazon Kinesis Data StreamsAmazon IoT Core のドキュメントをご確認下さい。

Andreas Calvo Gómez

AWS シニアソリューションアーキテクト。デジタル・ネイティブ・ビジネスに携わり、お客様が AWS 上でのソリューション構築を支援しています。クラウド技術と IoT に情熱を注いでいます。

この記事は Andreas Calvo Gómez によって書かれた “Best practices for ingesting data from devices using AWS IoT Core and/or Amazon Kinesis” の日本語訳です。この記事は ソリューションアーキテクトの 山岡 卓紀夫 が翻訳しました。