メインコンテンツまでスキップ

植物をクラウドに移行する

このレッスンの概要を示すスケッチノート

スケッチノート: Nitya Narasimhan 作。画像をクリックすると大きなバージョンが表示されます。

このレッスンは、Microsoft ReactorIoT 01 for Beginners Project 2 - Digital Agriculture series の一環として教えられました。

Azure IoT Hub でデバイスをクラウドに接続する

講義前のクイズ

講義前のクイズ

はじめに

前回のレッスンでは、植物を MQTT ブローカーに接続し、ローカルで実行されているサーバーコードからリレーを制御する方法を学びました。これは、家庭の個々の植物から商業農場まで使用されるインターネット接続の自動灌漑システムのコアを形成します。

IoT デバイスは、原則を示すためにパブリック MQTT ブローカーと通信しましたが、これは最も信頼性が高く安全な方法ではありません。このレッスンでは、クラウドとパブリッククラウドサービスによって提供される IoT 機能について学びます。また、パブリック MQTT ブローカーからこれらのクラウドサービスの 1 つに植物を移行する方法についても学びます。

このレッスンでは、次の内容をカバーします:

クラウドとは何か?

クラウドが登場する前、企業が従業員にサービス(データベースやファイルストレージなど)を提供したり、一般にサービス(ウェブサイトなど)を提供したりする場合、データセンターを構築して運営していました。これは、少数のコンピューターがある部屋から、多数のコンピューターがある建物までさまざまでした。企業は次のことを管理する必要がありました:

  • コンピューターの購入
  • ハードウェアのメンテナンス
  • 電力と冷却
  • ネットワーキング
  • セキュリティ(建物のセキュリティとコンピューター上のソフトウェアのセキュリティを含む)
  • ソフトウェアのインストールと更新

これは非常に高価で、幅広いスキルを持つ従業員が必要であり、必要に応じて変更するのに非常に時間がかかる可能性があります。たとえば、オンラインストアが忙しいホリデーシーズンを計画する必要がある場合、数か月前にハードウェアを購入し、構成し、インストールし、販売プロセスを実行するソフトウェアをインストールする必要があります。ホリデーシーズンが終わり、売上が減少した後、次の忙しいシーズンまでアイドル状態のコンピューターが残ります。

✅ これにより、企業は迅速に動くことができると思いますか?オンライン衣料品小売業者が突然有名人がその服を着ているのを見たために人気が出た場合、突然の注文の急増をサポートするためにコンピューティングパワーを迅速に増やすことができるでしょうか?

他人のコンピューター

クラウドはしばしば「他人のコンピューター」と冗談めかして呼ばれます。最初のアイデアはシンプルでした - コンピューターを購入する代わりに、他人のコンピューターをレンタルします。クラウドコンピューティングプロバイダーが巨大なデータセンターを管理し、ハードウェアの購入とインストール、電力と冷却の管理、ネットワーキング、建物のセキュリティ、ハードウェアとソフトウェアの更新などを担当します。顧客として、必要なコンピューターをレンタルし、需要が急増したときに追加でレンタルし、需要が減少した場合はレンタル数を減らします。これらのクラウドデータセンターは世界中にあります。

Microsoft クラウドデータセンター Microsoft クラウドデータセンターの計画拡張

これらのデータセンターは数平方キロメートルの広さになることがあります。上の画像は数年前に Microsoft クラウドデータセンターで撮影されたもので、初期のサイズと計画された拡張を示しています。拡張のためにクリアされたエリアは 5 平方キロメートル以上です。

💁 これらのデータセンターは非常に大量の電力を必要とするため、一部には独自の発電所があります。クラウドプロバイダーの投資レベルと規模のため、通常は非常に環境に優しいです。多数の小さなデータセンターよりも効率的で、主に再生可能エネルギーで運営され、クラウドプロバイダーは廃棄物の削減、水の使用量の削減、データセンターを建設するために伐採された森林の再植林に努めています。クラウドプロバイダーが持続可能性に取り組んでいる方法については、Azure 持続可能性サイトで詳しく読むことができます。

✅ 調査を行ってください: Microsoft の AzureGoogle の GCP などの主要なクラウドについて調べてください。彼らは何か所のデータセンターを持っており、それらは世界のどこにありますか?

クラウドを使用することで、企業のコストを抑え、クラウドコンピューティングの専門知識をプロバイダーに任せることができます。企業はもはやデータセンタースペースを借りたり購入したり、接続性や電力のために異なるプロバイダーに支払ったり、専門家を雇ったりする必要はありません。代わりに、クラウドプロバイダーにすべてを任せるために月額料金を支払うことができます。

クラウドプロバイダーは、規模の経済を利用してコストを削減し、コンピューターを一括購入して低コストで購入し、メンテナンスの作業負荷を減らすためのツールに投資し、クラウドオファリングを改善するために独自のハードウェアを設計および構築することができます。

Microsoft Azure

Azure は Microsoft の開発者向けクラウドであり、これらのレッスンで使用するクラウドです。以下のビデオは Azure の概要を簡単に説明しています:

Azure の概要ビデオ

クラウドサブスクリプションを作成する

クラウドサービスを使用するには、クラウドプロバイダーのサブスクリプションにサインアップする必要があります。このレッスンでは、Microsoft Azure サブスクリプションにサインアップします。すでに Azure サブスクリプションをお持ちの場合は、このタスクをスキップできます。ここで説明するサブスクリプションの詳細は執筆時点でのものであり、変更される可能性があります。

💁 これらのレッスンに学校を通じてアクセスしている場合、すでに Azure サブスクリプションが利用可能な場合があります。教師に確認してください。

サインアップできる無料の Azure サブスクリプションには 2 種類あります:

  • Azure for Students - これは 18 歳以上の学生向けのサブスクリプションです。サインアップにはクレジットカードは必要なく、学校のメールアドレスを使用して学生であることを確認します。サインアップすると、クラウドリソースに使用できる 100 米ドルと、無料の IoT サービスのバージョンを含む無料サービスが提供されます。これは 12 か月間有効で、学生である限り毎年更新できます。

  • Azure 無料サブスクリプション - これは学生でない人向けのサブスクリプションです。サブスクリプションにサインアップするにはクレジットカードが必要ですが、カードは請求されません。これは、あなたが本物の人間であり、ボットではないことを確認するために使用されます。最初の 30 日間で任意のサービスに使用できる 200 ドルのクレジットと、Azure サービスの無料ティアが提供されます。クレジットが使い果たされた後、支払いを行わない限り、カードは請求されません。

💁 Microsoft は 18 歳未満の学生向けに Azure for Students Starter サブスクリプションを提供していますが、執筆時点では IoT サービスをサポートしていません。

タスク - 無料のクラウドサブスクリプションにサインアップする

18 歳以上の学生である場合は、Azure for Students サブスクリプションにサインアップできます。学校のメールアドレスで確認する必要があります。これを行うには、次の 2 つの方法があります:

  • education.github.com/pack で GitHub 学生開発者パックにサインアップします。これにより、GitHub や Microsoft Azure を含むさまざまなツールやオファーにアクセスできます。開発者パックにサインアップした後、Azure for Students オファーを有効化できます。

  • azure.microsoft.com/free/students で直接 Azure for Students アカウントにサインアップします。

⚠️ 学校のメールアドレスが認識されない場合は、このリポジトリに issue を提出 し、Azure for Students 許可リストに追加できるかどうか確認します。

学生でない場合、または有効な学校のメールアドレスを持っていない場合は、Azure 無料サブスクリプションにサインアップできます。

クラウド IoT サービス

使用していたパブリックテスト MQTT ブローカーは学習時には素晴らしいツールですが、商業環境で使用するツールとしては多くの欠点があります:

  • 信頼性 - 無料サービスであり、保証はなく、いつでもオフにすることができます
  • セキュリティ - 公開されているため、誰でもテレメトリを聞いたり、ハードウェアを制御するコマンドを送信したりすることができます
  • パフォーマンス - 少数のテストメッセージのために設計されており、大量のメッセージを送信することはできません
  • 発見 - 接続されているデバイスを知る方法がありません

クラウドの IoT サービスはこれらの問題を解決します。これらは信頼性に大きく投資し、発生する可能性のある問題を修正するために待機している大規模なクラウドプロバイダーによって維持されています。ハッカーがデータを読み取ったり、不正なコマンドを送信したりするのを防ぐためにセキュリティが組み込まれています。また、非常に高性能であり、毎日何百万ものメッセージを処理でき、必要に応じてクラウドを利用してスケールします。

💁 これらの利点には月額料金がかかりますが、ほとんどのクラウドプロバイダーは、1 日あたりのメッセージ数や接続できるデバイス数が制限された無料バージョンの IoT サービスを提供しています。この無料バージョンは、開発者がサービスについて学ぶのに十分なことがほとんどです。このレッスンでは無料バージョンを使用します。

IoTデバイスは、デバイスSDK(サービスの機能を操作するためのコードを提供するライブラリ)を使用して、またはMQTTやHTTPなどの通信プロトコルを介して直接クラウドサービスに接続します。デバイスSDKは、公開するトピックや購読するトピックを知っていることや、セキュリティの処理方法など、すべてを処理してくれるため、通常は最も簡単なルートです。

デバイスはデバイスSDKを使用してサービスに接続します。サーバーコードもSDKを介してサービスに接続します

その後、デバイスはこのサービスを介してアプリケーションの他の部分と通信します。これは、MQTTを介してテレメトリを送信し、コマンドを受信した方法と似ています。通常、サービスSDKや同様のライブラリを使用します。メッセージはデバイスからサービスに送信され、アプリケーションの他のコンポーネントがそれを読み取り、その後、メッセージがデバイスに送信されます。

有効な秘密鍵を持たないデバイスはIoTサービスに接続できません

これらのサービスは、サービスに接続してデータを送信できるすべてのデバイスを知っていることによって、セキュリティを実装します。これは、デバイスがサービスに事前登録されているか、デバイスが初めて接続する際にサービスに自分自身を登録するために使用できる秘密鍵や証明書を持っていることによって行われます。未知のデバイスは接続できず、接続を試みるとサービスは接続を拒否し、それらから送信されたメッセージを無視します。

✅ 調査を行う: 任意のデバイスやコードが接続できるオープンなIoTサービスを持つことの欠点は何ですか?ハッカーがこれを悪用した具体的な例を見つけることができますか?

アプリケーションの他のコンポーネントは、IoTサービスに接続して接続されているすべてのデバイスを確認し、個別または一括で直接通信することができます。

💁 IoTサービスは追加の機能も実装しており、クラウドプロバイダーにはサービスに接続できる追加のサービスやアプリケーションがあります。たとえば、すべてのデバイスから送信されたすべてのテレメトリメッセージをデータベースに保存したい場合、クラウドプロバイダーの構成ツールで数回クリックするだけで、サービスをデータベースに接続してデータをストリームすることができます。

クラウドでIoTサービスを作成する

Azureサブスクリプションを取得したので、IoTサービスにサインアップできます。MicrosoftのIoTサービスはAzure IoT Hubと呼ばれます。

Azure IoT Hubのロゴ

以下のビデオは、Azure IoT Hubの概要を簡単に説明しています:

Azure IoT Hubの概要ビデオ

🎥 画像をクリックしてビデオを視聴

✅ 調査を行い、Microsoft IoT HubのドキュメントでIoT Hubの概要を読んでください。

Azureで利用可能なクラウドサービスは、Webベースのポータルまたはコマンドラインインターフェイス(CLI)を介して構成できます。このタスクでは、CLIを使用します。

タスク - Azure CLIをインストールする

Azure CLIを使用するには、まずPCまたはMacにインストールする必要があります。

  1. Azure CLIのドキュメントの指示に従ってCLIをインストールします。

  2. Azure CLIは、さまざまなAzureサービスを管理するための機能を追加する多くの拡張機能をサポートしています。次のコマンドをコマンドラインまたはターミナルで実行して、IoT拡張機能をインストールします:

    az extension add --name azure-iot
  3. コマンドラインまたはターミナルから次のコマンドを実行して、Azure CLIからAzureサブスクリプションにログインします。

    az login

    デフォルトのブラウザでWebページが起動します。Azureサブスクリプションにサインアップしたアカウントを使用してログインします。ログインが完了したら、ブラウザタブを閉じることができます。

  4. 学校提供のサブスクリプションや自分のAzure for Studentsサブスクリプションなど、複数のAzureサブスクリプションを持っている場合は、使用するサブスクリプションを選択する必要があります。次のコマンドを実行して、アクセスできるすべてのサブスクリプションを一覧表示します:

    az account list --output table

    出力には、各サブスクリプションの名前とSubscriptionIdが表示されます。

    ➜  ~ az account list --output table
    Name CloudName SubscriptionId State IsDefault
    ---------------------- ----------- ------------------------------------ ------- -----------
    School-subscription AzureCloud cb30cde9-814a-42f0-a111-754cb788e4e1 Enabled True
    Azure for Students AzureCloud fa51c31b-162c-4599-add6-781def2e1fbf Enabled False

    使用するサブスクリプションを選択するには、次のコマンドを使用します:

    az account set --subscription <SubscriptionId>

    <SubscriptionId>を使用するサブスクリプションのIDに置き換えます。このコマンドを実行した後、アカウントを一覧表示するコマンドを再実行します。IsDefault列がTrueに設定されていることがわかります。

タスク - リソースグループを作成する

Azureサービス(IoT Hubインスタンス、仮想マシン、データベース、AIサービスなど)はリソースと呼ばれます。すべてのリソースは、1つ以上のリソースの論理グループであるリソースグループ内に存在する必要があります。

💁 リソースグループを使用すると、複数のサービスを一度に管理できます。たとえば、このプロジェクトのすべてのレッスンが終了したら、リソースグループを削除すると、その中のすべてのリソースが自動的に削除されます。

  1. 世界中に複数のAzureデータセンターがあり、地域に分かれています。Azureリソースまたはリソースグループを作成する際には、作成する場所を指定する必要があります。次のコマンドを実行して、場所のリストを取得します:

    az account list-locations --output table

    場所のリストが表示されます。このリストは長くなります。

    💁 執筆時点では、デプロイできる場所は65か所あります。

        ➜  ~ az account list-locations --output table
    DisplayName Name RegionalDisplayName
    ------------------------ ------------------- -------------------------------------
    East US eastus (US) East US
    East US 2 eastus2 (US) East US 2
    South Central US southcentralus (US) South Central US
    ...

    最寄りの地域のName列の値をメモします。地域はAzure地理ページの地図で確認できます。

  2. 次のコマンドを実行して、soil-moisture-sensorという名前のリソースグループを作成します。リソースグループ名はサブスクリプション内で一意である必要があります。

    az group create --name soil-moisture-sensor \
    --location <location>

    <location>を前のステップで選択した場所に置き換えます。

タスク - IoT Hubを作成する

リソースグループにIoT Hubリソースを作成できます。

  1. 次のコマンドを使用して、IoT Hubリソースを作成します:

    az iot hub create --resource-group soil-moisture-sensor \
    --sku F1 \
    --partition-count 2 \
    --name <hub_name>

    <hub_name>をハブの名前に置き換えます。この名前はグローバルに一意である必要があります。つまり、他の誰も同じ名前のIoT Hubを作成できません。この名前はハブを指すURLで使用されるため、一意である必要があります。soil-moisture-sensor-のような名前を使用し、ランダムな単語や自分の名前などの一意の識別子を追加します。

    --sku F1オプションは無料ティアを使用することを示します。無料ティアは1日8,000メッセージと、フルプライスタイアのほとんどの機能をサポートします。

    🎓 Azureサービスの異なる価格レベルはティアと呼ばれます。各ティアには異なるコストがあり、異なる機能やデータ量を提供します。

    💁 価格について詳しく知りたい場合は、Azure IoT Hubの価格ガイドを確認できます。

    --partition-count 2オプションは、IoT Hubがサポートするデータストリームの数を定義します。複数のパーティションは、複数のものがIoT Hubから読み書きする際のデータブロッキングを減らします。パーティションはこれらのレッスンの範囲外ですが、この値は無料ティアのIoT Hubを作成するために設定する必要があります。

    💁 サブスクリプションごとに1つの無料ティアのIoT Hubしか持てません。

IoT Hubが作成されます。完了するまでに1分ほどかかる場合があります。

IoT Hubと通信する

前のレッスンでは、MQTTを使用して異なるトピックでメッセージを送受信しました。IoT Hubでは、異なるトピックでメッセージを送信する代わりに、デバイスがHubと通信するための定義された方法がいくつかあります。

💁 IoT Hubとデバイス間の通信は、MQTT、HTTPS、またはAMQPを使用して行われます。

  • デバイスからクラウドへのメッセージ(D2C) - これらは、テレメトリなどのデバイスからIoT Hubに送信されるメッセージです。アプリケーションコードによってIoT Hubから読み取ることができます。

    🎓 IoT Hubの内部では、Event HubsというAzureサービスを使用します。Hubに送信されたメッセージを読み取るコードを書くとき、これらはしばしばイベントと呼ばれます。

  • クラウドからデバイスへのメッセージ(C2D) - これらは、アプリケーションコードからIoT Hubを介してIoTデバイスに送信されるメッセージです。

  • 直接メソッドリクエスト - これらは、アプリケーションコードからIoT Hubを介してIoTデバイスに送信され、デバイスがアクチュエータを制御するなどの何かを行うように要求するメッセージです。これらのメッセージは、アプリケーションコードが正常に処理されたかどうかを確認できるように応答を必要とします。

  • デバイスツイン - これらは、デバイスとIoT Hubの間で同期されるJSONドキュメントで、デバイスによって報告された設定やその他のプロパティ、またはIoT Hubによってデバイスに設定されるべき(望ましい)プロパティを保存するために使用されます。

IoT Hubは、デバイスからクラウドへのメッセージや直接メソッドリクエストを設定可能な期間(デフォルトは1日)保存できるため、デバイスやアプリケーションコードが接続を失った場合でも、再接続後にオフライン中に送信されたメッセージを取得できます。デバイスツインはIoT Hubに永久に保存されるため、デバイスはいつでも再接続して最新のデバイスツインを取得できます。

✅ 調査を行う: デバイスからクラウドへの通信ガイダンスおよびクラウドからデバイスへの通信ガイダンスでこれらのメッセージタイプについて詳しく読んでください。

デバイスをIoTサービスに接続する

ハブが作成されたら、IoTデバイスを接続できます。登録されたデバイスのみがサービスに接続できるため、最初にデバイスを登録する必要があります。登録すると、デバイスが接続に使用できる接続文字列を取得できます。この接続文字列はデバイス固有であり、IoT Hub、デバイス、およびこのデバイスが接続するための秘密鍵に関する情報が含まれています。

🎓 接続文字列は、接続の詳細を含むテキストの一般的な用語です。これらは、IoT Hub、データベース、および多くの他のサービスに接続する際に使用されます。通常、サービスの識別子(URLなど)と秘密鍵などのセキュリティ情報で構成されます。これらは、サービスに接続するためにSDKに渡されます。

⚠️ 接続文字列は安全に保管する必要があります!セキュリティについては、今後のレッスンで詳しく説明します。

タスク - IoTデバイスを登録する

IoTデバイスは、Azure CLIを使用してIoT Hubに登録できます。

  1. 次のコマンドを実行してデバイスを登録します:

    az iot hub device-identity create --device-id soil-moisture-sensor \
    --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

    これにより、soil-moisture-sensorというIDのデバイスが作成されます。

  2. IoTデバイスがSDKを使用してIoT Hubに接続する際には、ハブのURLと秘密鍵を含む接続文字列を使用する必要があります。次のコマンドを実行して接続文字列を取得します:

    az iot hub device-identity connection-string show --device-id soil-moisture-sensor \
    --output table \
    --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

  3. 表示された接続文字列を保存しておきます。後で必要になります。

タスク - IoTデバイスをクラウドに接続する

IoTデバイスをクラウドに接続するための関連ガイドを参照してください:

タスク - イベントを監視する

今のところ、サーバーコードを更新する必要はありません。代わりに、Azure CLIを使用してIoTデバイスからのイベントを監視できます。

  1. IoTデバイスが実行され、土壌湿度のテレメトリ値を送信していることを確認します。

  2. コマンドプロンプトまたはターミナルで次のコマンドを実行して、IoT Hubからのメッセージを監視します:

    az iot hub monitor-events --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

    メッセージが送信されると、コンソール出力にメッセージが表示されます。

    Starting event monitor, use ctrl-c to stop...
    {
    "event": {
    "origin": "soil-moisture-sensor",
    "module": "",
    "interface": "",
    "component": "",
    "payload": "{\"soil_moisture\": 376}"
    }
    },
    {
    "event": {
    "origin": "soil-moisture-sensor",
    "module": "",
    "interface": "",
    "component": "",
    "payload": "{\"soil_moisture\": 381}"
    }
    }

    payloadの内容は、IoTデバイスから送信されたメッセージと一致します。

    執筆時点では、az iot拡張機能はApple Siliconで完全には動作していません。Apple Siliconデバイスを使用している場合は、Visual Studio Code用Azure IoTツールなどの別の方法でメッセージを監視する必要があります。

  3. これらのメッセージには、送信されたタイムスタンプなどの自動的に追加されるプロパティがいくつかあります。これらは注釈と呼ばれます。すべてのメッセージ注釈を表示するには、次のコマンドを使用します:

    az iot hub monitor-events --properties anno --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

    メッセージが送信されると、コンソール出力にメッセージが表示されます。

    Starting event monitor, use ctrl-c to stop...
    {
    "event": {
    "origin": "soil-moisture-sensor",
    "module": "",
    "interface": "",
    "component": "",
    "properties": {},
    "annotations": {
    "iothub-connection-device-id": "soil-moisture-sensor",
    "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
    "iothub-connection-auth-generation-id": "637553997165220462",
    "iothub-enqueuedtime": 1619976150288,
    "iothub-message-source": "Telemetry",
    "x-opt-sequence-number": 1379,
    "x-opt-offset": "550576",
    "x-opt-enqueued-time": 1619976150277
    },
    "payload": "{\"soil_moisture\": 381}"
    }
    }

    注釈の時間値は、1970年1月1日午前0時からの秒数を表すUNIX時間です。

    イベントモニターを終了します。

タスク - IoTデバイスを制御する

Azure CLIを使用して、IoTデバイスの直接メソッドを呼び出すこともできます。

  1. コマンドプロンプトまたはターミナルで次のコマンドを実行して、IoTデバイスのrelay_onメソッドを呼び出します:

    az iot hub invoke-device-method --device-id soil-moisture-sensor \
    --method-name relay_on \
    --method-payload '{}' \
    --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

    これにより、指定されたmethod-nameの直接メソッドリクエストが送信されます。直接メソッドは、メソッドのデータを含むペイロードを受け取ることができ、これはmethod-payloadパラメータでJSONとして指定できます。

    リレーがオンになり、IoTデバイスからの対応する出力が表示されます:

    Direct method received -  relay_on
  2. 上記の手順を繰り返し、--method-namerelay_offに設定します。リレーがオフになり、IoTデバイスからの対応する出力が表示されます。


🚀 チャレンジ

IoT Hubの無料ティアは1日8,000メッセージを許可します。10秒ごとにメッセージを送信するコードを書きました。10秒ごとに1つのメッセージは1日何メッセージですか?

土壌湿度の測定値をどのくらいの頻度で送信するべきか考えてみてください。無料ティア内に収まり、必要な頻度でチェックするためにコードをどのように変更できますか?2つ目のデバイスを追加したい場合はどうしますか?

講義後のクイズ

講義後のクイズ

レビューと自己学習

IoT Hub SDKは、ArduinoとPythonの両方でオープンソースです。GitHubのコードリポジトリには、さまざまなIoT Hub機能を操作する方法を示すサンプルが多数あります。

課題

クラウドサービスについて学ぶ