AzureとArduinoでIoT連携(IoTHub+StreamAnalytics+BlobStorage)

こんにちわ。

昨今のIoTシーンにおいて、猫も杓子もEspressifありきなのが納得行かない捻くれ者です。


# 概要
[Microsoft Azure](https://azure.microsoft.com/ja-jp) と [Arduino](https://www.arduino.cc) を連携させて、IoT環境構築にチャレンジしてみました。
今回は、AzureとArduinoの双方向メッセージングまでを試したいと思います。

# 使用するAzureサービス
## IoTHub
- [Azure IoTHub](https://azure.microsoft.com/ja-jp/services/iot-hub)

IoTデバイスを纏めて管理出来るサービスです。
主な内容は以下となります。

- デバイスの登録/削除
- 通信する際の認証
- データの送信/受信
- 状態監視


## StreamAnalytics
- [Azure StreamAnalytics](https://azure.microsoft.com/ja-jp/services/stream-analytics)

データストリームをリアルタイム処理してくれるサービスです。

今回は、IoTHubが受信したデータを受け取り、後述のBlobStorageへ書き込む、仲介役的な動作をしています。

なお、StreamAnalyticsの代わりに [Azure EventHubs](https://azure.microsoft.com/ja-jp/services/event-hubs) や [Azure Function](https://azure.microsoft.com/ja-jp/services/functions) を使う方法もあるそうです。
が、使ってみたら結構難しかったので、今回は一番簡単だったStreamAnalyticsを使う事にしました。


## BlobStorage
- [Azure BlobStorage](https://azure.microsoft.com/ja-jp/services/storage/blobs)

ストレージサービスです。

BlobStorageは、リアルタイム性の高いストリームデータを保存するのに向いてるそうです。

Azureのストレージサービスは他にも何種類か存在し、OneDriveのようにファイル単位の操作を得意とする [FileStorage](https://azure.microsoft.com/ja-jp/services/storage/files) や、SQL的なテーブルデータを扱える [TableStorage](https://azure.microsoft.com/ja-jp/services/storage/tables) などがあります。


---
Azureはホントに沢山のサービスが存在して、違うサービスでも実装によっては同じような事が出来たりします。
なので、やりたい事に対してどのサービスを使うのがベストか、と言うのは悩み所だと感じました。


# 使用するデバイス
## Arduino
互換ボードでも問題ありません。

ただ、[Mega328P](https://www.microchip.com/wwwproducts/ATmega328p) や [Mega32u4](https://www.microchip.com/wwwproducts/ATmega32u4
) 搭載ボードは、RAMが少ないので動かないかも知れません。
[SAMD21/51](https://www.microchip.com/design-centers/32-bit/sam-32-bit-mcus/sam-d-mcus) 搭載ボードなら確実だと思います。

僕は [Feather M4 Express](https://www.adafruit.com/product/3857) を使っています。


## WINC1500
WiFiモジュールです。

Arduinoとの接続は [SPI](https://ja.m.wikipedia.org/wiki/シリアル・ペリフェラル・インタフェース) となっています。
TLS1.2に対応しており、メジャーな証明書は出荷時に登録済なので、セキュア通信を手軽に実装出来ます。

僕は [WINC1500 Breakout](https://www.adafruit.com/product/2999) を使っています。

~~捻くれ者なのでESP8266は意地でも使いません。~~


# 仕様
## 通信方式
[MQTT over TLS](https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl) を使用します。

MQTTは、IoT向けに開発された通信プロトコルです。
HTTPと比較してヘッダサイズがとても小さい為、1回あたりの通信量が少なく、かつ頻繁にやり取りするIoT用途に丁度良いとされています。

ただ、HTTPと同様でMQTT自体に暗号化の概念は無いので、暗号化にTLSを用いた、MQTToverTLS(MQTTS)と言うプロトコルが主流となっています。

今回の通信方式は以下の通りです。

|項目|内容|
|:--|:--|
|通信プロトコル|MQTTS|
|暗号化方式|TLS1.2|
|ポート番号|8883|
|MQTT Version|3.1.1|
|最大送信パケットサイズ|1280 Byte|


## データフォーマット
ここは皆大好き [JSON](https://www.json.org/json-ja.html) で行きましょう。

僕はJavaScriptおじさんなので、XMLとか言う~~脂身だらけの肉みたいな~~見辛いフォーマットは苦手なのです、悪しからず。
(正直ArduinoもJavaScriptで書けたら良いのにとか思ってます。JerryScript...？そのうちね...)


# Azure側の構築
## ログイン
Microsoftアカウントで [ログイン](https://portal.azure.com) します。

初回ログイン時は、課金時のクレジットカード情報など、幾つかの追加情報を求められます。

なお、Azureの階層構成は以下の通りです。

|階層|名称|内容|
|:-:|:--|:--|
|1|ActiveDirectory|最上層, アカウントが所属する範囲|
|2|Subscription|課金プランが適用される範囲|
|3|ResourceGroup|リソースが所属するグループ|
|4|Resource|最下層, 各種サービス(IoTHubなど)|

ちなみに、僕のトップページはこんな感じになっています。
[![az-01.png](https://qiita-image-store.s3.amazonaws.com/0/253070/dc4d3be5-8e74-6cce-940d-9f36333934d0.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/212896d7-92c9-dac2-354c-4324c3bea7e1.png)

言葉で説明するとややこしくなるので、スクリーンショットを交えて解説して行きます。


## IoTHubの作成
### 1. リソースを作成する
**[リソースの作成]**から**[IoT Hub]**を選択します。
[![iothub-01.png](https://qiita-image-store.s3.amazonaws.com/0/253070/a2970fba-7b2d-58a3-ae30-1b5313175548.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/82e719e9-12b8-c8a6-50cb-83d95fbbbb3f.png)

初期設定画面が表示されるので埋めて行きます。
まずは**[Basics]**タブ。

|入力項目|内容|
|:--|:--|
|Subscription|現在のサブスクリプション名|
|Resource Group|既存or新規作成どちらでも|
|Region|東日本or西日本の近い方|
|IoT Hub Name|外部公開されるので機密情報や被りはNG|
[![iothub-02.png](https://qiita-image-store.s3.amazonaws.com/0/253070/f924efd9-c6a0-ee4a-9a93-65fda6490309.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/cdb17c14-3b76-740e-8aa4-37253b547ac0.png)

次は**[Size and scale]**タブ。

|入力項目|内容|
|:--|:--|
|Pricing and scale tier|F1: FreeTier|
[![iothub-03.png](https://qiita-image-store.s3.amazonaws.com/0/253070/89342931-3e56-bf56-e3df-4633404873e9.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/2a97477e-cc60-960d-97e9-758fd4214673.png)

終わったら、下の**[Review + create]**を押すと、数分間デプロイ処理の後、リソースが作成されます。

### 2. デバイスを登録する
作成したIoTHubリソースへ移動し、**[IoT devices]**から**[Add]**を選択します。
[![iothub-04.png](https://qiita-image-store.s3.amazonaws.com/0/253070/9c3870a5-2748-ad9b-e951-a4b3ed704ce9.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/54e77ba0-8dc3-9078-909d-5eac8e8b3a05.png)

デバイス名などの設定をしていきます。

|入力項目|内容|
|:--|:--|
|Device ID|リソース内で被らなければOK|
|Authentication type|初期値(Symmetric key)|
|Primary key|(自動入力)|
|Secondary key|(自動入力)|
|Auto-generate keys|チェック入れる(上2つのキーを自動生成してくれる)|
|Connect this device to an IoT hub|Enable|
|Parent device|よく分からんのでノータッチ|
[![iothub-05.png](https://qiita-image-store.s3.amazonaws.com/0/253070/eee1fcae-1d66-25cd-79b2-95883b0b1e9f.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/0403ed76-b427-d36e-98e5-7d237369b1d4.png)

終わったら、下の**[Save]**を押すと、登録完了です。

### 3. 接続キーを確認する
登録したデバイス名を選択します。
[![iothub-06.png](https://qiita-image-store.s3.amazonaws.com/0/253070/a64eb55b-6094-fe33-fe4b-fff9f520bc2a.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/ff8e5930-f7bc-d7dd-1ebc-9378ade90881.png)

キーが沢山並んでますが、デバイスとの通信に必要なのは1個だけです。

|確認項目|内容|
|:--|:--|
|Connection string (primary key)|後述のArduinoスケッチ内`String azurekey`に貼り付ける|
[![iothub-07.png](https://qiita-image-store.s3.amazonaws.com/0/253070/7a05989c-8cd4-6d24-20c7-f0f7a93a5726.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/49585a99-d3b6-398c-c394-99f4b1790afb.png)

これでIoTHubの準備は完了です。


## BlobStorageの作成
### 1. リソースを作成する
**[リソースの作成]**から**[ストレージアカウント]**を選択します。
[![bs-01.png](https://qiita-image-store.s3.amazonaws.com/0/253070/bafa26b5-606c-ea64-ecd0-cee88f56ccae.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/a4eab202-2bef-7483-efb1-387fff4548ba.png)

初期設定を埋めて行きます。
まずは**[基本]**タブ。

|入力項目|内容|
|:--|:--|
|サブスクリプション|現在のサブスクリプション名|
|リソースグループ|既存or新規作成どちらでも|
|ストレージアカウント名|外部公開されるので機密情報や被りはNG|
|場所|東日本or西日本の近い方|
|パフォーマンス|Standard|
|アカウントの種類|Storage(汎用v1)|
|レプリケーション|ローカル冗長ストレージ(LRS)|
[![bs-02.png](https://qiita-image-store.s3.amazonaws.com/0/253070/6d5a735c-8c5e-30e3-8f68-eae1e5b5fee6.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/f99552bb-a4b9-03b8-6e5d-6c9ccbf24359.png)

次は**[詳細]**タブ。

|入力項目|内容|
|:--|:--|
|安全な転送が必須|有効|
|仮想ネットワーク|すべてのネットワーク|
|DATA LAKE STORAGE GEN2|よく分からんので初期値(無効)|
[![bs-03.png](https://qiita-image-store.s3.amazonaws.com/0/253070/8577191f-5312-292f-5c8d-797bd1424e66.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/ce413dbd-e111-b300-4196-47427eace087.png)

終わったら、下の**[確認および作成]**を押すと、数分間デプロイ処理の後、リソースが作成されます。

これでBlobStorageの準備は完了です。


## StreamAnalyticsの作成
### 1. リソースを作成する
**[リソースの作成]**から**[Stream Analytics job]**を選択します。
[![sa-01.png](https://qiita-image-store.s3.amazonaws.com/0/253070/551c0ef2-5b0d-e14e-6813-12c2c1331492.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/75605f07-72b5-ac12-72d4-df2f9190d62f.png)

初期設定を埋めて行きます。

|入力項目|内容|
|:--|:--|
|job name|外部公開されるので機密情報や被りはNG|
|Subscription |現在のサブスクリプション名|
|Resource Group|既存or新規作成どちらでも|
|Region|東日本or西日本の近い方|
|Hosting environment|Cloud|
|Streaming units (1 to 120)|1|
[![sa-02.png](https://qiita-image-store.s3.amazonaws.com/0/253070/185250f7-a4cb-5a6e-4608-181bbcd3a8e5.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/18fbf695-11f9-feeb-7ed2-84ca0bfdebae.png)

終わったら、下の**[作成]**を押すと、数分間デプロイ処理の後、リソースが作成されます。

### 2. 言語設定
作成したStreamAnalyticsリソースに移動し、**[Locale]**を選択します。

|入力項目|内容|
|:--|:--|
|Data locale|日本語(日本)|
[![sa-03.png](https://qiita-image-store.s3.amazonaws.com/0/253070/58851882-1008-fab2-8969-22e17d068609.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/34ecab40-8caa-5c82-4693-ff46c409f003.png)

終わったら、上の**[Save]**で保存完了です。

### 3. データ入力先を作成する
**[Inputs]**から**[Add stream input]**内の**[IoT Hub]**を選択します。
[![sa-04.png](https://qiita-image-store.s3.amazonaws.com/0/253070/038f2ceb-cbfb-05ed-a40a-bef29425b7ac.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/7dbd90a5-b690-6d5a-a870-b5627edfb104.png)

入力先設定を行います。

|入力項目|内容|
|:--|:--|
|Input alias|リソース内で被らなければOK|
|Provide IoT Hub settings manually|チェック外す|
|Select IoT Hub from your subscriptions| チェック入れる|
|サブスクリプション|現在のサブスクリプション名|
|IoT Hub|入力先のIoTHub名|
|Endpoint|Messaging|
|Shared access policy name|iothubowner|
|Shared access policy key|(自動入力)|
|Consumer group|よく分からんので初期値($Default)|
|Event serialization format|皆大好きJSON(CSVもあるよ)|
|Encoding|UTF-8|
|Event compression type|よく分からんので初期値(None)|
[![sa-05.png](https://qiita-image-store.s3.amazonaws.com/0/253070/0985071a-7479-e193-7239-8296adf9bb31.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/5532fbb7-6430-3d70-65a4-2a2bc8b8cd24.png)

終わったら、下の**[Save]**で保存完了です。


### 4. データ出力先を作成する
**[Outputs]**から**[Add]**内の**[Blob storage]**を選択します。
[![sa-06.png](https://qiita-image-store.s3.amazonaws.com/0/253070/a97fda1d-15a3-d03e-0d3c-48421b95cfa9.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/89f5677b-fbac-8a3b-74b9-cc12773e1f38.png)

出力先設定を行います。

|入力項目|内容|
|:--|:--|
|Output alias|リソース内で被らなければOK|
|Provide Blob storage settings manually|チェック外す|
|Select Blob storage from your subscriptions|チェック入れる|
|サブスクリプション|現在のサブスクリプション名|
|Storage account|出力先のStorage名|
|Storage account key|(自動入力)|
|Container|BlobStorage内フォルダの事, 既存or新規作成どちらでも|
|Path pattern|{Date}(日付毎にフォルダが自動作成される)|
|Date format|YYYY/MM/DD|
|Time format|よく分からんので初期値(自動入力)|
|Event serialization format|皆大好きJSON(CSVもあるよ)|
|Encoding|UTF-8|
|Format|よく分からんので初期値(Line separated)|
[![sa-07.png](https://qiita-image-store.s3.amazonaws.com/0/253070/a38ed410-8fe2-7b8d-c987-724f6c76c065.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/a123ce10-b532-f6c3-b654-3380dd83d66c.png)

終わったら、下の**[Save]**で保存完了です。

### 5. 処理内容を記述する
**[Query]**を選択し、エディタ内にSQL文を記述します。

```sql
-- 入力データを出力に丸投げする
select * into [output_alias] from [input_alias]
```
[![sa-08.png](https://qiita-image-store.s3.amazonaws.com/0/253070/bfcbcce8-ecc9-e2fd-683c-ae29ddb97407.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/a1bc029d-7e9a-a8fa-bbd0-240eceb9371d.png)

終わったら、上の**[Save]**で保存完了です。

これで、StreamAnalyticsの準備は完了です。


# Arduino側の構築
## ハードウェアの実装
至って単純です。
SPIバスと電源をそれぞれ接続するだけです。

SPI信号ピン**{MISO, MOSI, SCK}**は、両側とも指定のピンに接続します。
SPI制御ピン**{CS, IRQ, RST, EN}**は、Arduino側は何処のピンに接続しても大丈夫です。

今回はそれぞれ**{9, 10, 11, 12}**番ピンとしました。

|Arduino側ピン|WINC1500側ピン|
|:--|:--|
|MISO|MISO|
|MOSI|MOSI|
|SCK|SCK|
|任意(Pin9)|CS|
|任意(Pin10)|IRQ|
|任意(Pin11)|RST|
|任意(Pin12)|EN|
[![hard-wire.png](https://qiita-image-store.s3.amazonaws.com/0/253070/06b5c838-2254-afe7-b3a5-ae6dc4a2347b.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/6f76b1f5-1f51-d61d-9db4-494d40226c14.png)

ブレッドボードに組んだ状態ですが、至ってシンプルです。
(右下のディスプレイはデバッグ用なので関係無いです)
[![hard.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/85ad7d99-b3c6-ffa2-9bb2-e106308a7f23.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/17022889-8779-b7e3-890b-ff8b2ef37fa6.jpeg)


## ソフトウェアの実装
ESP8266向けのIoTHubクライアントライブラリを、Arduino/WINC1500でも使用出来るように移植しました。
なお、このライブラリは、Arduino公式WiFiライブラリを内部参照しているので、そちらも併せてインストールします。

- [Azure IoTHub Client - GitHub](https://github.com/dojyorin/Azure-iothub-mqtt-winc1500)
- [WiFi101 Library - Arduino.cc](https://www.arduino.cc/en/Reference/WiFi101)

基本はサンプルスケッチの通りで大丈夫です。
**{SSID}**など固有の部分を追加入力したら、コンパイルと書き込みを行います。

基本的な使用方法は [readme.md](https://github.com/dojyorin/Azure-iothub-mqtt-winc1500/blob/master/readme.md) にざっくり書いてあるので、掻い摘んで解説します。


### 1. `WiFi.setPins(cs, irq, rst, en);`
先ほど [ハードウェアの実装](#ハードウェアの実装) で接続した、SPI制御ピンの番号をそれぞれ指定します。
今回の例では以下となります。

```c++
WiFi.setPins(9, 10, 11, 12);
```


### 2. `String azurekey = "";`
先ほど [接続キーを確認する](#3. 接続キーを確認する) で確認した**[Connection string (primary key)]**を貼り付けます。
イメージとしてはこんな感じです。

```c++
String azurekey = "HostName=<HostName>;DeviceId=<DeviceName>;SharedAccessKey=<DeviceKey>";
```

---
なお、サンプルスケッチでは、**{A0}**ピンのアナログ値を送信するようになっています。
通常はここにセンサー等を接続して、読み取った値を送信するような感じになります。

が、今回の趣旨はデバイスとクラウドの連携なので、センサーは接続しなくても問題無いです。
センサーを接続しなかった場合は、空文字列が送信されます。


# 動作テスト
全ての準備は整いました。

### 1. StreamAnalyticsを起動する
**[Start]**を選択し、起動タイミングを指定します。

|入力項目|内容|
|:--|:--|
|Job output start time|Now|
[![try-01.png](https://qiita-image-store.s3.amazonaws.com/0/253070/6dc2267f-2cc6-21d9-2993-2ddc7a028e74.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/e8d0be84-3101-f7c8-90ff-766d1d402aac.png)

終わったら、**[Start]**を押した後、数十秒で起動が完了します。
起動後は、**[Stopped]**の部分が**[Running]**に変わります。


### 2. Arduinoを起動する
PCとArduinoを接続し、COMポートを開きます。
**[Attempting MQTT connection... connected]**と表示されたら、IoTHubとの接続は成功です。
その後は無限ループで、データが送信される度に**[pushed]**と表示されます。
[![try-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/eb9d95d4-e24b-a625-2965-9f0ae11dfcd5.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/9517f5dd-f67c-6341-3db2-44b2e8bb0cd4.png)


### 3. 蓄積されたデータを確認する
Storageリソースを開き、**[Blob]**からコンテナ名を選択します。
[![try-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/c7bbb314-9bf3-e8d1-ae30-e0579e0827c3.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/42f0a802-bd4d-54ea-d556-6b5bd7719373.png)

コンテナを辿って行くとJSONファイルがあるので、開いてから**[BLOBの編集]**を選択します。
エディタに、Arduinoから送信されたJSONデータが蓄積されていれば、無事に動作している証です。
[![try-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/0fbf1d7c-d7b5-29a7-f942-59c19c78b9e2.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/6c7327ca-34e7-107c-708e-583c1b5a29ea.png)

### 4. デバイスにデータを送信する
そしてIoTHub最大の魅力、デバイスへのデータ送信を行います。
IoTHubリソースを開き、**[IoT devices]**からデバイス名を選択します。
[![iothub-06.png](https://qiita-image-store.s3.amazonaws.com/0/253070/a64eb55b-6094-fe33-fe4b-fff9f520bc2a.png)](https://qiita-image-store.s3.amazonaws.com/0/253070/ff8e5930-f7bc-d7dd-1ebc-9378ade90881.png)

上の**[Message to device]**を選択します。
[![try-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/a4bc6ee4-1a99-df25-10a5-1b33dbab5101.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/51be5600-0aea-2edc-51b7-8d5267c09145.png)

**[Device Id]**を確認後、送信したいメッセージを入力します。
今回は試してませんが、**[Properties]**よりJSON文字列も送信可能です。

|入力項目|内容|
|:--|:--|
|Message Body|(お好みで)|
[![try-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/0e05583b-6475-3997-51d7-e7d53431d752.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/5cad92eb-c4df-94b4-47cc-489f365b004f.png)

終わったら、上の**[Send Message]**を押すと、数秒後に送信完了します。

そして、COMポートに**[Azure Message arrived [(your message)]]**と表示されれば無事成功です。
[![try-06.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/f6131611-87f3-2a59-88be-d2980816b31f.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/83246eb4-5fc5-12d5-298f-612e181e60e8.png)


### 5. StreamAnalyticsを停止する
StreamAnalyticsリソースを開き、**[Stop]**から**[はい]**を選択します。
[![try-07.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/717b9489-4567-1127-02ff-699e403c54b9.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/9085ff79-be6f-9d5c-2537-9b30c8925e94.png)

クラウドサービスは、使った分だけ課金されます。
万が一ではありますが、サービスを起動したまま接続キーが漏れてしまい、悪用されてしまったら、それはもう顔面蒼白な請求書が届く事は間違い無しです。

悪用が証明出来れば、救済措置はあるそうですが、そんな寿命の縮むような思いをしない為にも、使わないサービスはこまめに停止しましょう。

### 6. メトリクス(ログ)を確認する
Azureサービスは、誰が何をいつどれだけ使ったか、一目瞭然で表示されます。

StreamAnalyticsは、このグラフから**{21:50から22:00にかけて計40回の入力と出力があった}**と言う事がパッと見で分かります。
[![try-08aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/6c47e52c-ad8c-e754-294b-f62367d9fc6e.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/ed32478d-c27d-228e-f474-3358e0a5029d.png)

IoTHubは、このグラフから**{21:50から22:00にかけて94回の受信と1回の送信があった}**と言う事が分かります。
[![try-09aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/253070/a91237af-9d2b-fb90-ca72-09ccb1027b73.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/253070/f3f57034-fb11-606c-1179-eba229ba617e.png)

勿論、各リソースの**[メトリック]**欄から、もっと詳細なログを条件指定で確認出来ます。


# まとめ
かなり長くなってしまいましたが、逆を言えば、たったこれだけでIoTデバイスとクラウドサービスを連携可能、とも言えるでしょう。

そもそもクラウドサービスの利用自体が初めてだったので、最初はかなり敷居高そうなイメージでした。
しかし、実際使ってみたら思ったより簡単で、イメージが大きく変わりました。

環境は整ったので、後は足回りを肉付けするだけです。
色々と想像が膨らみますが、また次回としましょう。

それではまた。