Amazon Web Services ブログ

IoT デバイスから AWS クラウドに大きなペイロードを安全に取り込む方法

この記事は2021年8月23日に投稿された記事(リンク) の日本語訳です。

AWS IoT Core は、IoT デバイスから AWS クラウドへペイロードを安全に取り込み、数十億のデバイスと数兆のメッセージをサポートします。また、メッセージの処理やデバイスの管理をクラウド上で確実かつ安全に行うことができます。AWS IoT Core を使ったソリューションを設計する際に課題となる可能性のあるのが、MQTT ペイロードの最大許容サイズに厳しい制限があることです。このブログを書いている時点では、AWS IoT Core がサポートする最大 MQTT ペイロードは 128KB しかありません (最新の情報はこちらをご確認ください)
AWS IoT サービスは、このサイズを超えるパブリッシュや接続要求を拒否します。大きなサイズのペイロードを扱う一般的な IoT のユースケースとしては、以下のようなものが考えられます。

  • 医療画像のクラウドへの取り込み。
  • 医療機器からの心音や肺音の記録と送信。
  • スマートシティでの交通事故を検知するための音声ファイルの送信。
  • 交通ルール違反の際に、ナンバープレートを撮影して送信。
  • 産業用機械から生成されたバイナリファイルのクラウドへの取り込み。

このブログ記事では、大きなサイズの IoT ペイロードをスケーラブルに取り込む方法を説明します。これは、特に制約としてエッジでの演算能力に制限のあるデバイスや、クラウドに取り込む前にユースケースに対応したペイロードを1つ以上保持できるだけのメモリを持つデバイスに適用できます。

さらに、セキュリティの実現に関する設計についても説明します。これは以下のようなリスクがあるため、非常に重要です。

  • IoT エコシステムでは、デバイスがインターネットに接続されているため、大規模な攻撃対象となる可能性があります。
  • 環境におかれたデバイスの数は急速に増加する可能性があるため、開発ライフサイクル全体でセキュリティを設計してから実装することがより重要になります。セキュリティ設計を後付けすると、アーキテクチャや設計の変更が必要になり、ソリューションはより複雑になります。

ソリューションの概要

MQTT ペイロードサイズのハードリミットに対処するために、Amazon Simple Storage Service (Amazon S3) を使用してペイロードの保存を行います。その際のプロトコルは MQTT とは別で HTTPS を使用します。その他の要件についてはデバイスシャドウ、レジストリ、ルールエンジンなどの AWS IoT Core が持つ機能を引き続き使用することができます。Amazon S3 は、サイズの大きいオブジェクトを保存するための、信頼性とコスト効率の高いサービスです。

Amazon S3 のバケットを非公開にし、安全性を確保し、最小権限の原則に従うことが最善の方法です。任意のエンティティがプライベート S3 バケットとやりとりするための推奨メカニズムの1つは、署名付き URL を使用することです。このケースでは、クラウド側の Lambda 関数によって各デバイスのリクエストに応じた署名付き URL が生成されます。署名付き URL とは、特定の S3 オブジェクトへの一時的なアクセスを、特定の期間、AWS のセキュリティ認証や権限を必要とせずに付与し、その後、期限切れとなって利用できなくなる URL のことです。この URL を使用すると、オブジェクトの読み込みや書き込みをすることができます。AWS S3 の署名付き URL を初めてご利用になる場合は、「署名付き URL の使用」および「署名付きURLを使用したオブジェクトのアップロード」をご確認ください。

ファイルの取り込みが完了したら、次のステップはデータを元にアクションを起こすことです。AWS IoT Core とは異なり、S3 バケットと連動するルールエンジンはありません。Amazon S3 Event Notifications を使用すると、S3 バケットで PUT イベントがトリガーされるたびに通知を受け取ることができます。Amazon S3 は、イベントを発行できる以下の宛先をサポートしています。

このソリューションでは、ペイロードの処理に AWS Lambda を使用していますが、ユースケースに応じて、他の2つの配信先を使用してイベントを発行することもできます。詳しくは、 Amazon S3 イベント通知をご確認ください。

ペイロードを AWSクラウド に取り込むために、デバイスは以下のステップを実行します。

  • AWS クラウドに接続するために、IoT デバイスは、X.509 証明書を使用して自身を認証することにより、AWS IoT Core へのアクセスを要求します。
  • IoT デバイスは、署名付き URL を生成するためにトピックにリクエストを送信します。
  • ルールエンジンが Lambda 関数を呼び出し、署名付きURL を生成します。
  • Lambda 関数は、デバイス固有のトピックに署名付き URL を送信します。
  • IoT デバイスが URL を受信し、ペイロードを HTTPS POST で S3 バケットにアップロードします。
  • ファイルがアップロードされると S3 が Lambda 関数にイベントを送り、処理を開始します。
アーキテクチャイメージ

このアプローチの別のバリエーションとして、ステップ4の部分で、デバイスシャドウを使用して、クラウドからデバイスに署名付き URL を通信する方法があります。IoT アプリケーションでは、デバイスをリモートで制御したり、コマンドが正常に実行されたことを確認したりするために、コマンドトピックが使用されます。ベストプラクティスについては、Using the AWS IoT shadow for commands をご確認ください。

なお、このブログで紹介しているソリューションは、IoT デバイスからクラウドに大きなサイズのペイロードを取り込む唯一の方法ではありません。ここでは、いくつかの代替案をご紹介します。場合によってはこれらが適しているかもしれませんが、ここでは深く掘り下げません。

  • メッセージの分割。
    この方法では、大きなペイロードをデバイス側で小さなチャンクに分割し、MQTT を使ってパブリッシュします。トピックのサブスクライバーは、チャンクを収集し、メッセージを並べ替えて再構成するという追加対応が必要になり、ソリューションに段階的なステップを追加します。このアプローチの課題は、追加対応の部分でエラーが発生しやすいことと、デバイスと AWS IoT Core の間で送信されるメッセージの数に応じて課金されるため、コストが増大する可能性があることです。
  • REST サーバー
    REST API は柔軟性と拡張性を提供しますが、REST はデザイン上、リクエストごとに接続が必要となります。これにより、レイテンシーが発生し、IO 数と消費電力が増加します。さらに REST サーバーは、リクエストを処理するためにネットワークが接続され続けていることを必要とします。制約のある機器で、低遅延で頻繁にデータを取り込む必要がある場合や、接続が断続的な場合は、REST サーバー方式は適さない可能性があります。

ここからは前述のソリューションにより、セキュリティの実装方法に関する設計について説明します。

認証

信頼できるデバイスだけがクラウドにアクセスするためには、強力な IoT デバイス認証メカニズムが必要です。強力な認証メカニズムを使用することで、デバイスのなりすましやハッカーによるクラウドへのアクセスを防ぐことができます。

一般的に、各デバイスは固有の X.509 証明書を持っています。これらの証明書は、AWS IoT にデバイスの接続を認証する機能を提供します。デバイスがプライベートな Amazon S3 データにアクセスできるようにするには、署名付き URL を生成することで POST リクエストを認証することができます。

認可

認可とは、認証されたデバイスに適切な許可を与えるプロセスです。認証されたデバイスのみが署名付き URL にアクセスでき、ペイロードが保存される S3 バケットへのアクセスを許可されます。デバイスのアップロード帯域や能力を考慮して、署名付き URL の有効期限を慎重に設定することが重要です。一度発行された URL は、取り消したりタイムアウトさせたりすることはできません。

AWS IoT Core を使用すると、認証されたデバイスに関連付けられた各証明書に必要なアクセス許可 ( IoT ポリシー) を関連付けることができ、AWS に安全に接続して運用することができます。ポリシーベースの認証を使用すると、最小権限の原則が適用され、すべてのデバイスは、そのデバイス向けの特定のトピックにのみアクセスできます。これにより、認証されていないエンティティが URL にアクセスすることはありません。

エンド・ツー・エンドの暗号化

前述のソリューションでは、通信に 2 つのチャネルがあります。MQTT は署名付き URL を要求・受信するために使われ、HTTPS はペイロードを S3 にアップロードするために使われます。

デフォルトでは、AWS IoT のデータは、保管時と転送中の両方で暗号化されます。メッセージブローカーは、TLS バージョン 1.2 を使用して、転送中のすべての通信を暗号化します。保管時のデータは、AWS が所有する鍵を使って暗号化されます。

S3 にペイロードをアップロードするために、HTTPS は転送中のデータを暗号化し、権限のないユーザーによるネットワークトラフィックの盗聴や操作を防止します。保管時の S3 のデータを暗号化するには、サーバー側の暗号化(SSE)またはクライアント側の暗号化を使用することができます。S3 関連のセキュリティのベストプラクティスについては、「Amazon S3 のセキュリティベストプラクティス」をご確認ください。

まとめ

この記事では、IoT デバイスから AWS クラウドに大きなサイズのペイロードを安全に取り込むためのパターンを説明しました。また、ソリューション・アーキテクチャの手順、デザインによるセキュリティの実装方法を説明しました。このパターンで使用されているサービスは、マネージドでスケーラブルなサービス(AWS IoT Core、S3、Lambda)であり、拡張性の高いIoT プラットフォームの理想的なビルディングブロックとなっています。詳細については、AWS IoT Core のドキュメントをご確認ください。

著者について

Vishal Gupta

Vishal Guptaは、Amazon Internet Services Private Limited(AISPL)のソリューションアーキテクトで、インドのデリーに拠点を置いています。Vishal Gupta は、AWS Digital Native Business(DNB)のお客様と協力し、AWS 上で革新的なソリューションを設計・構築できるようにしています。仕事以外では、新しい場所への旅行や家族との時間を楽しんでいます。

この記事はソリューションアーキテクトの伊藤が翻訳しました。