SORACOMの使用状況をLagoonで可視化してみた

2019/11/23に開催されたSORACOM UG Explorer 2019にてLTした「SORACOMの使用状況をLagoonで可視化してみた」をやってみるための記事をまとめました。技術ブログ初投稿です。

# 経緯

皆様SORACOM使ってますか？

SORACOMは「IoTの民主化」を掲げる携帯回線(SORACOM Air)を軸としたIoTサービスで、

- 回線のステータスをコンソールやAPIで取得、操作できる
- SIMを認証デバイスとしてデバイス側に認証情報やSDKを持たずにクラウド連携できる
- データを可視化するLagoonや簡単・安全なデバイス遠隔操作を実現するNapterなど豊富なサービスが付随している

などにより高い人気を博しています。

そんなソラコムですが、使い始めてしばらく経ち、SIMの枚数が増えてくると、ある問題に直面します。それは、

![SIM-LIMIT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/32a4c7b8-4f21-96b2-2d85-a323f81e6a0c.png)

**SIMが全部見れない**という問題です。

同時に表示できるのが100までで、「最後へ」というリンクも無いので、アカウント内のSIMの枚数を確認しようと思ったら「次へ」をクリックしまくるしかないんですね。これは困った。

SORACOMのコンソールは特定条件のSIMを検索して、その詳細状況を確認したり操作したりする分にはとても便利なのですが、全体の状況を把握したり、推移を分析したりするのには向いていないんですね。SORACOM内でそのような可視化を担当するサービスはSORACOM Lagoonです。今回はSORACOM Lagoonを使ってSORACOMの使用状況を可視化したいと思います。

# 構成

以下の図のような構成で使用状況の可視化を実現します。

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/a882f6c0-e7db-4ca7-e0e1-45fca8a6ea5a.png)

### Web API

可視化の対象となるSORACOMの使用状況はWEB APIにて取得することが出来ます。仕様や使い方は以下に記載されています。

https://dev.soracom.io/jp/docs/api_guide/
https://dev.soracom.io/jp/docs/api/

SIMの枚数だけでなく、通信量や接続イベント、課金状況など、可視化したくなる要素がいっぱいありますね。コンソールにて閲覧できるデータは全てWeb APIでも提供されているので、これを使って使用状況を収集出来そうです。

### SORACOM Harvest

収集したデータはSORCOM Harvestに保存します。SORACOM HarvestはSORACOM Airの回線からデータをアップロードするのが基本的な使い方です。これはデバイスに認証情報を持つことなく、TCPやUDPでデータを送るだけでデータ保存ができる優れものなのですが、SIMと結びついているため、サーバーからデータを収集してアップロードする用途には使えません。

### SORACOM Inventory

SORACOM Inventoryというデバイス管理サービスで作成したデバイスを用いて、インターネット経由でSORACOM Harvestにデータをアップロードすることもできるようになっているため、上の課題はこれで解決できます。

https://blog.soracom.jp/blog/2018/07/04/inventory-update/

これを知っているとSORACOMの使い方の幅が広がりそうですね。SORACOM Inventoryは発表された時にはLwM2Mというプロトコルを使ってデバイスの管理ができるサービスとして紹介されていて、LwM2M？よくわかんない、ということで使わなかった人も多いのではないかと思いますが、これは普通のHTTPSのWebAPIで使えます。

### SORACOM Lagoon

SORACOM Harvestにデータが保存されたら、SORACOM Lagoonにて可視化できます。SORACOM LagoonはGrafanaをベースとしたダッシュボードツールで、SORACOMにアップロードされたデータをグラフや表、ヒートマップなど様々な形で表示する事が出来ます。グラフィカルな可視化の部分を自分で作るのは大変なのでとてもありがたい。

### 無料枠について

これらのサービスは無料枠があり、今回は基本構成だと全て無料で使用できます。

- WebAPI: 使用料金無し
- SORACOM Harvest: 1アカウントあたり毎月31日分の「Harvest利用オプション」が無料
- SORACOM Inventory: 初期費用（100円/台）、月額費用(50円/台)を含めて、月あたり 150円分が無料
- SORACOM Lagoon: Freeプラン(ダッシュボード、ユーザー、アラートが1つに制限)

（SIMごとの分布分析したい場合はデバイスが複数必要になり、Harvestが月150円、Inventoryが月50円追加されます）

# 準備

必要な準備は以下の2つです

- SAMユーザー
- SORACOM Inventoryデバイス

### SAMユーザー

SAMユーザーは、SORACOM Access Managementのユーザーで、SORACOMにアクセスする権限が限定されたユーザーを作成、管理できる機能です。

いわゆるルートユーザーは権限が強く、自動処理のためにサーバーなどに置いておくことは基本的にはお勧めできません。最低限の権限を持ったユーザーを作って、そのユーザーで実行しましょう。

以下に作成手順がありますので、これに従って「認証キーID」「認証キーシークレット」を取得してください。
https://dev.soracom.io/jp/start/sam/

SAMユーザーには適切な権限を設定する必要があります。今回のツールで使用する以下の権限を作成したSAMユーザーに設定します。

```json
{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "Subscriber:listSubscribers",
        "Subscriber:listSessionEvents",
        "Log:getLogs",
        "Billing:exportBilling",
        "Stats:exportAirStats"
      ]
    }
  ]
}
```

SAMユーザーの準備はこれで終了です。

### SORACOM Inventory デバイス

SORACOM Inventoryは「デバイス」を任意に作成する事ができ、そのデバイスを用いてHarvestにデータをアップロードしたり、LwM2Mにより制御を実行したりする事ができます。

以下に作成手順がありますので、これに従って「デバイスID」「シークレットキー」を取得してください。
https://dev.soracom.io/jp/start/inventory_harvest_with_keys/

なお、上の記事にも微妙に書かれているのですが、デバイス作るだけじゃダメでHarvestが使えるデバイスグループを作ってデバイスをそのグループに所属させる必要があります。この記事の「ステップ3-1: デバイスのグループ設定」にグループ設定の方法が書いてあるので、これに従ってデバイスグループを作りましょう。

https://dev.soracom.io/jp/start/inventory-manage-device/#group

デバイスは最低１つは必要です。使用状況の全体を把握するためのデバイスで「soracom-summary」などと名前をつけると分かりやすいでしょう。
SIMごとの通信量、課金、セッション接続/切断数を分析したい場合は、それぞれ個別にデバイスを作成する必要があります。

デバイスの準備はこれで終了です。

# ツールの導入

Web APIからデータを収集し、SORACOM Harvestにアップロードするためにツールを作成し、GitHubおよびRubyGemsに公開しています。
https://github.com/1stship/soracom_summary
https://rubygems.org/gems/soracom_summary

PCにrubyがインストールされていれば、

`gem install soracom_summary`

でインストールでき、

`soracom_summary`

で実行できます。
（Rubyのインストールについては、申し訳ありませんが他の記事をあたってください）

実行にはSAMユーザーとデバイスの認証情報を環境変数を設定しておく必要があります。

```bash
$ export SORACOM_AUTH_KEY_ID='SAMユーザーの認証キーID'
$ export SORACOM_AUTH_KEY='SAMユーザーの認証キーシークレット'
$ export SORACOM_SUMMARY_DEVICE_ID='デバイスのデバイスID'
$ export SORACOM_SUMMARY_DEVICE_SECRET='デバイスのシークレットキー'
```

にて環境変数を設定してから実行してください。

--sessionオプションを指定する事でセッションイベント（回線の接続/切断）の解析をする事ができますが、SIMの１枚1枚に対して情報を取得していくため、SIMの枚数が多いとかなり時間がかかります。面白い情報が取れるのでオプションにするのはもったいないんですけどね。（セッションイベントも課金情報や通信量と同じようにCSVでエクスポートできるようにならないだろうか）

また、そのうち改善しますが、現時点では実行中にはなにも表示されません。

```bash
$ SORACOM_SUMMARY_DEBUG=true soracom_summary
```

のようにデバッグ出力を有効にすると進捗がある程度わかりますので、必要に応じてご利用ください。

その他使い方の説明はGitHubのドキュメントをご覧いただければと思います。

またツールはMITライセンスで公開しているので、好きなように利用、改変してもらっていいです。ご意見はGitHubのIssueに上げればそのうち対応するかもしれません。（今回のLTを機にソラコムさんが公式で使用状況可視化サービス提供してくれるみたいな話もあるので、ソラコムさんに意見出した方がいいかもしれない）

# 可視化

さて、ようやく準備ができたので可視化にいきましょう。まず以下の手順に従ってLagoonのFreeプランに登録してダッシュボードにログインします。

https://dev.soracom.io/jp/start/lagoon-dashboards/

最初はSinglestatで数値表示をしましょう。
singlestatのパネルを追加して、
![singlestat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/e793a90e-7401-2032-d53f-d124873d4b36.png)

パネルの編集をクリックし、
![singlestat2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/33b2e76a-73cd-df96-4e8a-ba528ae88060.png)

メトリックを、Device、soracom-summary(準備で作ったデバイスの名前)、Standard、subscribers-totalを選択します。
![singlestat3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2bdf63f5-808f-cdc1-7b51-857425cb2404.png)

オプションで「表示」を「現在値」にしておきましょう。初期値は「平均値」なので、意図せず表示期間での平均が取られています。
![singlestat5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/785b5583-c942-1f9b-4790-e2511d62f986.png)

全般タブでタイトルを編集して完成です。
![singlestat4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/36599fa0-6246-f900-5061-ec27189af3bb.png)

タイトル部分のドラッグで移動、パネル右下部分のドラッグでサイズ変更ができますので、いい感じに配置できます。
![singlestat6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/9038546f-7732-14c5-10ae-ae863ea5fdb5.png)

単位をつけたい場合はオプションタブの単位から、適切なものを選びます。補助単位(kとかMとか)も勝手につきます。
![singlestat7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/77d10a38-8169-9cfa-f202-7cf015a11d1c.png)

こんな感じで数字でパッとみて確認したい項目をSinglestatで置いていきます。SIM関係はsubscribers、請求関係はbillings、通信量関係はtrafficsがプレフィクスになっていますので、適当に選んで、適当に並べていきます。
![singlestat8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/6c45ada6-2935-0117-c5d6-352a3ed7c02d.png)

こんなもんですかね。おー、なんかどのくらい使ってるかが分かった気分になりますね。（ちなみにこの数字は実際のサービスの数字をもとに加工してアップロードしています。）

次はグラフを作っていきましょう。Graphのパネルを追加して、
![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/55f56ddf-e7af-b661-c114-b88321ae7099.png)

タイトル、メトリックの選び方はSinglestatと同じです。メトリックは同じグラフ上に表示させる複数のメトリックを追加していきましょう。
![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/d6f17e91-0a1e-052f-ff44-4d9d430dc75d.png)

（メトリックをプレフィックス＋ワイルドカード(billings-day-*とか)で指定できればな〜。1個1個選ぶのめんどくさい）

こんな感じでグラフを並べました。おー、推移と変動要素と割合が分かってきた感じがしますね。
![graph3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/35babed6-5cb8-fe1e-a2fe-945ea1ebf578.png)

最後にHeatmapでSIMごとの分布を見たいと思います。これはsoracom-summaryとは別のデバイスからアップロードさせる必要があり、たとえばbillingだと

```bash
$ export SORACOM_BILLING_DEVICE_ID='請求分析用デバイスのデバイスID'
$ export SORACOM_BILLING_DEVICE_SECRET='請求分析用デバイスのシークレットキー'
```

を環境変数に上げた時のみアップロードされます。これは現在のところ動的に変動するメトリックを扱う方法が「デバイスを選択したら下の全部が選択される」という方法しかない（と思われる）からです。

ではHeatmapを作っていきましょう。これまでと同様Heatmapパネルを選択して、
![heatmap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/51ce8e8f-e9b0-46d9-9631-32a1cd2cb36d.png)

メトリックはbilling専用のデバイスを選び、一番右の欄は空白のままにしておきます。これによりこのデバイスの下のメトリック(IMSI)が全て選択された状態になります。
![heatmap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/b6a86661-1ab2-f9e5-03ff-cee4661ea081.png)

X軸のSizeを1d(1日)にしておきましょう。１日ごとの集計を取っているので、こうしておいた方が表示がぶれなくて良いです。
![heatmap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/85671c33-093f-0050-9a18-71b9c47ed906.png)

なんかすごく課金されてるSIMがいますね。。こうなると下の方の分布がわからなくなるので、必要に応じてY-MaxとY-AxisのSizeを変更して、下の方の分布がわかるようにします。
![heatmap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/5dccf03b-4f34-ff8b-df5e-5d482da5e07b.png)

0-10に入っているのは、まだ開始されていないSIMですね。開始されて、あまりもしくは全く通信していないSIMは基本料金10円＋通信料金やBeamの使用料金でちょっと増えるので、10-20に入ります。これが一番多い。そこそこ使われているSIMは30-40の範囲に入るものが多いみたいですね。そして何らかの通常使用ではないユースケース(Napterとか)があると、通常使用の範囲を超えて上に行く、という感じが見て取れます。

こういう、

- 普通はどういう使われ方をしているか
- 通常使用の範囲を超えた使われ方をしているSIMはないか

がパッと見てわかるのはHeatmapの面白いところですね。

そんな感じで通信量のSIM分析も入れてこんな感じのダッシュボードになりました。
![meatmap5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/76c40497-7d0d-5ba1-e4c8-3069173a1ff9.png)

皆さんもぜひ使用状況を可視化してみてください。いろんなものが見えてくるのではないかと思います。

# 最後に

今回のSORACOM UG Explorer 2019では、POCを終えてすでに実用段階に入っているIoTサービスの発表が多くあり、すでにIoTは普通になりつつあるのだなということを感じます。その中でソラコムが果たしている役割は大きいですね。

IoTサービスの実稼働に当たっては、このようなモニタリングやアラーム、遠隔制御による対処など運用面の課題が増えてくると思います。ソラコムが今後のIoTの課題にどのようなソリューションを提供してくるのか、今後も動向に注目していきたいと思います。