【初心者】AWS IoT Coreを調べてみた

# 背景・目的
AWS IoT Core について理解するために、整理します。

# まとめ
- デバイスがAWSや他のデバイスに接続し処理できる。
− AWS IoT Coreの特徴を以下に整理しました。

| | 概要 | 機能や特徴 | |
|:---|:---|:---|:---|
|IoT デバイスSDK  | デバイスがIoT Coreと接続する際に使用。簡単に接続可能。複数のプロトコルが使用できる。|以下のプロトコルをサポート<BR>・MQTT<BR>・HTTP<BR>・WebSockets<BR><BR>以下の言語をサポート<BR>・C<BR>・JavaScript<BR>・Aruduino | |
|Device Advisor | テスト機能| フルマネージド<BR>IoT Coreと確実に相互運用できるかテストする | |
|デバイスゲートウェイ | IoTデバイスがAWSに接続する入り口<BR>複数のプロトコルに対するセマンティクスを実装し、デバイスがIoT Coreと安全で効率的な通信ができるようにする。| フルマネージドでオートスケーリング可能<BR>(ユーザは管理しなくても10億以上のデバイスがサポートされる。)|
| メッセージブローカー|Pub/Subメッセージブローカー<BR>デバイスがいくつであっても、メッセージのやり取りができる。 | フルマネージドでオートスケーリング可能| 
|認証と認可 | 相互認証と暗号化を提供 | IoT Coreとデバイス間で身元が証明されたデータのみ交換される<BR>以下の認証をサポート<BR>・AWSの認証（SigV4)<BR>・X.509証明書<BR>・作成したトークンベース（カスタムオーソライザー使用）<BR><BR>フルマネージドでオートスケーリング可能<BR><BR>個別のデバイスのアクセスを取り消すことが可能<BR>Cognitoを使用してユーザのモバイルアプリケーションからの接続もサポート| |
|レジストリ |デバイスの一意なIDにより属性、機能などのメタデータが追跡可能<BR> | |
|デバイスシャドウ |永続的な仮想バージョンのこと |デバイスの最新状態が保存される。これにより以下のことが可能になる。<BR>・アプリケーションや他のデバイスからのメッセージの読み出し<BR>・デバイスとの通信<BR>アプリケーションではデバイスの現在の状態を取得せずに、希望する状態を設定可能(希望する状態と、最後に報告された時点の状態の相違をIoT Coreが比較し、相違を補うようにデバイスに対してコマンドを送る。) |
| ルールエンジン |接続したデバイスにより生成されたデータを収集、処理、分析、データに基づいたアクションを実行するアプリケーションを構築可能<BR> | インフラの管理は不要<BR>ビジネスルールに基づき、IoT Coreに向けて発行された入力メッセージが評価、変換され、別のデバイスやクラウドサービスへと配信される。<BR>1つのデバイスからのデータにも、多数のデバイスからのデータにも同じルールが適用でき、アクションを単独or並行して実行が可能。| 


# 概要
## AWS IoT Coreとは
[AWSのドキュメント](https://aws.amazon.com/jp/iot-core/features/?nc=sn&loc=3)を元に整理しています。
> AWS IoT Core を使用すると、デバイスを AWS のサービスや他のデバイスに接続し、データと通信を保護し、デバイスデータに対する処理やアクションを行うことで、アプリケーションはオフラインの場合でもデバイスとやり取りでき、低コストの Alexa 組み込みデバイスを作成できます。

- AWSサービス、他のデバイスに接続できる。
- デバイスデータに対する処理、アクションを設定する。
- アプリケーションはオフラインでもデバイスとやり取りができる。

## 主な特徴
### AWS IoT デバイスSDK
> AWS IoT デバイス SDK を使用すれば、ハードウェアデバイスまたはモバイルアプリケーションを簡単かつすばやく AWS IoT Core に接続できます。AWS IoT デバイス SDK を使用すれば、AWS IoT Core との間で MQTT、HTTP、または WebSockets プロトコルを介した接続、認証、メッセージ交換が可能になります。AWS IoT デバイス SDK では C、JavaScript および Arduino がサポートされており、クライアントライブラリ、開発者ガイドおよびメーカー向けのガイドが付属しています。オープンソースの SDK を使用することや、独自に SDK を作成することも可能です。

- IoT デバイスSDKを使い、IoT Coreに接続できる。
- IoT SDKによりCoreと以下のプロトコルを介した「接続」、「認証」、「メッセージ交換」が可能になる。
    - MQTT
    - HTTP
    - WebSockets
- IoTデバイスSDKでは、以下の言語がサポートされている。
    - C
    - JavaScript
    - Aruduino
- クライアントライブラリ、開発者ガイド、メーカ向けガイドが付属されている。
- OSSのSDKの使用、または独自のSDKを作成可能。

### Device Advisor
> Device Advisor は、開発中に IoT デバイスを検証するための完全マネージド型のクラウドベースのテスト機能です。デベロッパーが AWS IoT Core との信頼性の高い安全な接続について IoT デバイスを検証できるよう、ビルド済みのテストを提供します。Device Advisor を使用することで、デベロッパーは IoT デバイスが AWS IoT Core と確実に相互運用できるかどうかをテストし、セキュリティのベストプラクティスを実行することができます。デベロッパーは、デバイスを本番環境にデプロイする前に、開発中に最も一般的なデバイスソフトウェアの問題を特定して解決することができます。また、Device Advisor からは署名付きの認定レポートも提供されます。このレポートは、ハードウェアパートナーが、独自のデバイスを AWS Partner Device Catalog に登録しようとする際に使用できます。 詳細を確認し、使用を開始するには、Device Advisor の概要ページ、技術ドキュメント、およびブログを参照してください。

- フルマネージドのクラウドベースのテスト機能
- ビルド済みのテストを提供。
    - IoT Coreと確実に相互運用できるかテスト
    - セキュリティのベストプラクティスを実行
- 署名付きの認定レポートの提供
    - ハードウェアパートナーが独自のデバイスをAWS Partner Device Catalogにｔ登録しようとする際に使用できる。

### デバイスゲートウェイ
> デバイスゲートウェイは IoT デバイスが AWS に接続する入口の役割を果たします。デバイスゲートウェイはすべてのアクティブなデバイスの接続を管理し、複数のプロトコルに対するセマンティックスを実装して、デバイスが AWS IoT Core と安全で効率的に通信できるようにします。現在、デバイスゲートウェイでは MQTT、WebSocket、HTTP 1.1 プロトコルがサポートされています。MQTT または WebSockets で接続するデバイスでは、デバイスゲートウェイは長時間の双方向性接続を維持して、これらのデバイスが低レイテンシーでいつでもメッセージを送受信できるようにします。デバイスゲートウェイは完全マネージド型で、自動的にスケーリングするため、ユーザーがインフラストラクチャの管理をしなくても 10 億以上のデバイスがサポートされます。AWS IoT に移行する顧客の場合、デバイスゲートウェイは既存のアーキテクチャと IoT デバイスへの影響を最小限に抑えて移行する機能を提供します。構成か能小名エンドポイントの詳細については、こちらのドキュメントをお読みください。

- IoTデバイスがAWSに接続する入り口
- デバイスゲートウェイは、全てのアクティブなデバイスの接続を管理
- 複数のプロトコルに対するセマンティクスを実装し、デバイスがIoT Coreと安全で効率的な通信ができるようにする。
- サポートされているプロトコルは以下の通り。
    - MQTT
    - WebSocket
    - HTTP1.1
- MQTT、WebSocketsで接続するデバイスでは、デバイスゲートウェイは長時間の双方向性接続を維持し、これらのデバイスが低レイテンシーでいつでもメッセージ送受信できるようにする。
- フルマネージドでオートスケーリング可能
    - ユーザは管理しなくても10億以上のデバイスがサポートされる。

### メッセージブローカー
> メッセージブローカーは高スループットの pub/sub メッセージブローカーで、ユーザーのすべての IoT デバイスとアプリケーションと低レイテンシーで安全にメッセージを送受信します。メッセージブローカーのトピック構造は柔軟で、デバイスがいくつであっても、メッセージのやり取りができます。1 対 1 のコマンドとコントロールメッセージから、1 対 100 万 (またはこれ以上も!) ものブロードキャスト通知システムまでのメッセージパターンをサポートします。さらに、アクセスコントロールをきめ細かに設定して個々の接続の許可をトピックレベルで管理できるようにして、お客様のデバイスとアプリケーションが、送受信するべきデータのみを送受信するようにします。メッセージブローカーは完全マネージド型のサービスですので、どのような使い方をしても、お客様がインフラを実行しなくても、そのメッセージ量を自動的にスケーリングします。

- 高スループットのPub/Subメッセージブローカー
- 低レイテンシー、安全なメッセージを送受信
- 1:100万以上のブロードキャスト通知システムまでのメッセージパターンをサポート
- アクセスコントロールにより、トピックレベルで管理し、デバイスとアプリケーションが送受信するべきデータ飲みを送受信可能
- フルマネージドでオートスケーリング

### 認証と認可
> AWS IoT Core では、接続するすべてのポイントでの相互認証と暗号化が提供されており、デバイスと AWS IoT Core 間では身元が証明されたデータのみが交換されます。AWS IoT Core では、AWS の認証方法 (「SigV4」と呼ばれる)、X.509 証明書ベースの認証、お客様が作成したトークンベースの認証 (カスタムオーソライザーを使用) がサポートされています。 HTTP による接続ではこれらの方法のいずれかを使用できます。MQTT による接続では証明書ベースの認証、WebSockets による接続では SigV4 またはカスタムオーソライザーを使用できます。AWS IoT Core では、AWS IoT Core によって生成された証明書、および推奨される認証機関 (CA) によって署名された証明書を使用できます。それぞれの証明書に対して任意のポリシーをマッピングでき、デバイスに触れることなく、デバイスやアプリケーションによるアクセスを認証したり、考えが変わったときにすべてのアクセスを取り消したりできます。

- 相互認証と暗号化を提供
    - IoT Coreとデバイス間で身元が証明されたデータのみ交換される
- 以下の認証をサポート
    - AWSの認証（SigV4）
    - X.509証明書
    - 作成したトークンベース（カスタムオーソライザー使用）
- プロトコルによって使用できる認証方法が変わる。

| |HTTP |MQTT |WebSockets|
|:--- |:--- | :--- | :--- | 
|SigV4 |◯ | ||
|X.509証明書 |◯|◯ |  |
|トークン |◯ | |◯|

- IoT Coreによって生成された証明書、推奨されるCAにより署名された証明書を使用できる。
    - それぞれの証明書に対し、ポリシーをマッピングできる
    - アクセスを認証したり、取り消したりの操作が可能

> デバイスについての証明書やポリシーの作成、デプロイおよび管理は、コンソールから、または API を使用して実行できます。これらのデバイス証明書のプロビジョニング、アクティベーションおよび関連付けは、AWS IoT Core を使用して設定された関連する IoT ポリシーによって行うことができます。これにより、必要な場合にはいつでも個別のデバイスのアクセスを即座に取り消すことができます。AWS IoT Core では、Amazon Cognito を使用して、ユーザーのモバイルアプリケーションからの接続もサポートしています。アプリケーションのユーザーに一意の ID を作成し、権限が限定された一時的な AWS 認証情報を取得するために必要なすべてのステップは Amazon Cognito によって処理されます。デバイスで X.509 証明書による認証が行われると、AWS IoT Core では一時的な AWS 認証情報の提供が行われます。これにより、デバイスは DynamoDB や S3 のようなその他の AWS のサービスに簡単にアクセスできるようになります。

- 証明書、ポリシーの作成、デプロイ、管理はコンソールやAPIから可能
- IoTポリシーにより、以下のことが可能。これにより個別のデバイスのアクセスを取り消すことが可能
    - プロビジョニング
    - アクティベーション
    - 関連付け
- Cognitoを使用してユーザのモバイルアプリケーションからの接続もサポートしている。
    - アプリケーションのユーザーに一意のIDを作成し、権限が限定された一時的なクレデンシャルを取得するためのステップを処理

> AWS IoT Core のフリートプロビジョニングにより、大規模のクラウドに簡単に任意の数の製造されたデバイスをオンボードすることができます。エンドツーエンドのマネージドデバイスのオンボーディングエクスペリエンスを提供し、一意のデジタルIDを使用してデバイスをセットアップし、AWS IoT への最初の接続時に自動的に各デバイスが AWS IoT Core と接続して動作するために必要なデバイス側およびクラウド側の構成を実行します。フリートプロビジョニングは、顧客に追加請求なしで提供されます。フリートプロビジョニングの詳細については、こちらのフリートプロビジョニングのドキュメントをお読みください。
詳細については、AWS IoT Core ユーザーガイドのセキュリティと認証のセクション を参照してください。

- フリートプロビジョニングにより、任意の数のデバイスをオンボードできる。
- 追加請求なし。

### レジストリ
> レジストリによって、デバイスの ID が確定され、デバイスの属性や機能といったメタデータが追跡されます。各デバイスには、デバイスのタイプや接続方法にかかわらず、一貫した形式の一意の ID がレジストリによって割り当てられます。センサーが温度を報告するかどうか、および温度データが華氏か摂氏かといった、デバイスの機能を説明するメタデータもサポートされています。

- デバイスの一意なIDにより属性、機能などのメタデータが追跡可能。

> レジストリではデバイスについてのメタデータを追加料金なしで保存でき、最低 7 年間に 1 度レジストリのエントリを更新していれば、レジストリ内のメタデータが期限切れになることはありません。

- 7年間に1度レジストリのエントリを更新することでメタデータの期限は切れない。

### デバイスシャドウ
> AWS IoT Core では、それぞれのデバイスについて「シャドウ」、つまり永続的な仮想バージョンを作成できます。デバイスシャドウにはデバイスの最新の状態が保存されるため、アプリケーションや他のデバイスからのメッセージの読み出し、およびデバイスとの通信が実行できます。デバイスシャドウには、デバイスがオフライン状態のときでも、各デバイスについて最後に報告された状態と、希望する今後の状態が保持されます。最後に報告された時点の状態の取得や、希望する今後の状態の設定は、API またはルールエンジンによって実行できます。

> デバイスシャドウでは、REST API が常時利用できるため、デバイスと協働するアプリケーションの構築が容易になります。さらに、アプリケーションではデバイスの現在の状態を取得することなく、希望する今後の状態を設定できます。希望する状態と最後に報告された時点の状態との相違は AWS IoT Core によって比較され、相違を補うようデバイスに対してコマンドが送られます。

> AWS IoT デバイス SDK によって、簡単にデバイスの実際の状態とデバイスシャドウを同期させ、デバイスシャドウによって設定された希望する今後の状態に対応させることができます。

> デバイスシャドウには、デバイスの状態を最大 1 年間無料で保存できます。最低 1 年間に 1 度更新していれば、デバイスシャドウは無期限に継続できます。更新しなかった場合は消去されます。

- デバイスシャドウとは、永続的な仮想バージョンのこと
- デバイスの最新状態が保存される。これにより以下のことが可能になる。
    - アプリケーションや他のデバイスからのメッセージの読み出し
    - デバイスとの通信
- REST APIが常時利用できる。
- アプリケーションではデバイスの現在の状態を取得せずに、希望する状態を設定可能
- 希望する状態と、最後に報告された時点の状態の相違をIoT Coreが比較し、相違を補うようにデバイスに対してコマンドを送る。
- 一年間無料でデバイスの状態を保存可能。最低一年に一度更新することにより無期限に継続できる。

### ルールエンジン
> ルールエンジンによって、インフラストラクチャの管理を一切必要とせずに、接続されたデバイスによって生成されるデータを収集、処理、分析、データに基づいたアクションを実行するアプリケーションを構築することが可能になります。ルールエンジンでは、お客様が定義したビジネスルールに基づいて、AWS IoT Core に向けて発行された入力メッセージが評価、変換され、別のデバイスやクラウドサービスへと配信されます。1 つのデバイスからのデータにも、多数のデバイスからのデータにも同じルールを適用でき、アクションを単独で実行することも、多数のアクションを並行して実行することも可能です。

- 接続したデバイスにより生成されたデータを収集、処理、分析、データに基づいたアクションを実行するアプリケーションを構築可能。
- インフラの管理は不要
- ビジネスルールに基づき、IoT Coreに向けて発行された入力メッセージが評価、変換され、別のデバイスやクラウドサービスへと配信される。
- 1つのデバイスからのデータにも、多数のデバイスからのデータにも同じルールが適用でき、アクションを単独or並行して実行が可能。

> Rules Engine は、AWS IoT Analytics、AWS IoT Events、AWS Lambda、Amazon Kinesis、Amazon S3、Amazon DynamoDB、Amazon CloudWatch、Amazon Simple Notification Service (SNS)、Amazon Simple Queue Service (SQS)、Amazon Elasticsearch Service、AWS Step Functions などの AWS エンドポイントへメッセージをルートすることもできます。AWS Lambda、Amazon Kinesis、Amazon SNS、Rules Engine のネイティブ HTTP アクションを使用して、外部エンドポイントへ到達できます。
ルールは、マネジメントコンソール内で作成するか、または SQL に似た構文を使用して作成します。メッセージの内容に応じて異なる動作をするようにルールを作成できます。例えば、温度の読み取り値が一定のしきい値を越えたときに、AWS Lambda にデータを送信するルールをトリガーするようにします。他のデバイスからのデータなど、クラウド内の他のデータを組み合わせるようにルールを作成することも可能です。例えば、温度が他の 5 つのデバイスの平均より 15% 以上高かった場合にアクションを実行するよう設定できます。

- 以下のAWSエンドポイントへメッセージをルーティングできる
    - AWS IoT Analytics
    - AWS IoT Events
    - AWS Lambda
    - Amazon Kinesis
    - Amazon S3
    - Amazon DynamoDB
    - Amazon CloudWatch
    - Amazon Simple Notification Service (SNS)
    - Amazon Simple Queue Service (SQS)
    - Amazon Elasticsearch Service
    - AWS Step Functions
- 以下のネイティブHTTPアクションにより、外部エンドポイントへ送信できる
    - AWS Lambda
    - Amazon Kinesis
    - Amazon SNS
    - Rules Engine
- マネコンで作成 or SQLに似た構文でルールを作成する。
    - メッセージの内容により異なる動作をするようにルールを作成できる。

> ルールエンジンにはデータの変換に使用可能な数十の機能が準備されており、AWS Lambda を介することで無限に増やすことが可能です。例えば、広い範囲の値を扱っている場合、入力される数値の平均を取ることができます。ルールからは、AWS Lambda 内の Java、Node.js または Python コードをトリガーすることも可能なので、最大限の柔軟性と能力を備えたデバイスデータ処理が行えます。

- データの変換に使用可能な数十の機能が準備されている。またLambdaにより無限に増やせる。

### AWS IoT Core for LoRaWAN
> AWS IoT Core for LoRaWAN を使うと、顧客は、低電力の長距離広域ネットワーク (LoRaWAN) 技術を使用している無線デバイスに接続することができます。AWS IoT Core を使用して、独自の LoRaWAN デバイスとゲートウェイを AWS クラウドに接続することで、企業においてプライベート LoRaWAN ネットワークをセットアップできるようになりました。LoRaWAN Network Server (LNS) を開発または運用する必要はありません。これにより、LNS や関連インフラの管理にまつわる未分化の開発作業や運用負担がなくなり、ネットワークのセットアップ時間を短縮できます。

- 低電力の長距離広域NWを使用している無線デバイスに接続可能

### Amazon Sidewalk 統合
> Amazon Sidewalk は、接続オプションの改善を通じて接続されたデバイスの動作を向上させる共有ネットワークです。Amazon が顧客に無料で提供している Sidewalk は、新しいデバイスのセットアップを簡素化し、デバイスの低帯域幅の動作範囲を拡大し、デバイスが自宅の Wi-Fi の範囲外にある場合でもオンライン状態を維持できるようにします。

- 接続オプションの改善を通じて接続されたデバイスの動作を向上させる共有NWを
- 新しいデバイスのセットアップを簡素化
- デバイスの低帯域幅の動作範囲を拡大、

# 考察
AWS IoT Core について理解するために、調べましたが、まだまだピンときていません。
今後は、AWS IoT関連のサービスをまとめていくと同時に、ハンズオンで動作確認し理解を深めていく予定です。

# 参考
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/what-is-aws-iot.html

https://aws.amazon.com/jp/iot-core/features/?nc=sn&loc=3