Azure Iot HubのダイレクトメソッドをREST APIから呼んでみる


概要

Azure Iot Hubに登録された全てのデバイスに対して、ダイレクトメソッドを実行します。

1台だけであれば、Azure Portal上から実行するのが手っ取り早いのですが、台数が多かったり、実行結果を他で使いたい場合などはAzure Portal以外から呼び出したくなります。

今回はダイレクトメソッドを実行し、結果を保存するところまでを試してみました。

ダイレクトメソッドのREST API呼び出し

ダイレクトメソッドを呼び出す方法については、公式ドキュメントとして丁寧に記載されています。

curl -X POST \
  https://iothubname.azure-devices.net/twins/myfirstdevice/methods?api-version=2018-06-30 \
  -H 'Authorization: SharedAccessSignature sr=iothubname.azure-devices.net&sig=x&se=x&skn=iothubowner' \
  -H 'Content-Type: application/json' \
  -d '{
    "methodName": "reboot",
    "responseTimeoutInSeconds": 200,
    "payload": {
        "input1": "someInput",
        "input2": "anotherInput"
    }
}'

SharedAccessSignature sr=iothubname.azure-devices.net&sig=x&se=x&skn=iothubowner の部分はSAS tokenの生成を行うと、自動で作られる。

az iot hub generate-sas-token -n {iothub_name}

{iothub_name} は適切なリソース名に書き換える。
そして、これをCloud Shellで実行すると・・

`az iot hub: 'generate-sas-token' is not in the 'az iot hub' command group. See 'az iot hub --help'

って怒られる。
えー。

Azure Cloud Shell 上で generate-sas-token を使えるようにする

まず、Cloud Shell は、Azure Portal 上の、> _アイコンで開きます。

BashでもPowerShellでも使いやすい方を選択するのがいいと思います。

ログか何かを保存するのか、ストレージが必要になるようです。
ストレージ名とかは「詳細設定の表示」で設定できます。(今回はデフォルトのまま作成してみました)

初期化処理に少し時間が必要です。

同じようにエラーになって困っていた人の解決策を丸パクります。

az extension add --name azure-cli-iot-ext

エラーが出なければOK!
で、もう一度tokenを発行してみます。

az iot hub generate-sas-token -n a4f2d132-4cc0-4d6e-8737-9bff40ac4729

最終的にはこんな感じでできました。

--du or --duration に注意

tokenの有効期間はデフォルトで3600秒です。

--du --duration
 Valid token duration in seconds.
 default value: 3600

もしも、1時間過ぎちゃうと、unauthorized って怒られることになりますので、ご注意ください。

準備完了

で、冒頭に戻って、作成したtokenを使えば、アクセスできるようになります。(下記)

curl -X POST \
  https://iothubname.azure-devices.net/twins/myfirstdevice/methods?api-version=2018-06-30 \
  -H 'Authorization: SharedAccessSignature sr=a4f2d132-4cc0-4d6e-8737-9bff40ac4729.azure-devices.net&sig=YM1USuqL5yHj%2B30GDT71xT9H%2FFuEKnjKNKf3TqUslX8%3D&se=1569424734&skn=iothubowner' \
  -H 'Content-Type: application/json' \
  -d '{
    "methodName": "reboot",
    "responseTimeoutInSeconds": 200,
    "payload": {
        "input1": "someInput",
        "input2": "anotherInput"
    }
}'

ちなみに myfirstdevice の部分はデバイス名です。

雑感

このあと、デバイス名の一覧を手動でとってきて、Bashでループを回しながら結果を取得しています。

が、イケてないので、デバイス名の一覧も自動で取得して、sas tokenも都度取得して・・ってとこまで自動化できれば最高だなって思っています。

以上。
ご覧いただきましてありがとうございました!