1NCE IoT SIMのData StreamerデータをAWS QuickSightで可視化してみる

皆さんこんにちは。ソリューションアーキテクトのTakamasaです。

この記事では、2022年10月26日から日本で事業開始した低容量IoT回線、1NCE（ワンス）のSIM管理プラットフォーム上で設定するData Streamer（データストリーマー）を使って、回線利用状況のデータをAWS QuickSight上で可視化する方法を紹介します。

## 1NCE IoT回線プラットフォームとは？
そもそも1NCE IoT回線というもの自体がまだまだ新しいものなので、簡単に特徴をまとめてみます。

>1回線当たり一括2,200円（税込）の支払いのみで、最長10年間、500MBまで利用可能（プリペイド式）
SIMカード1枚からオンラインで購入可能
日本国内に加えて、140以上の国と地域において追加料金なしでローミングサービスを利用可能
SIMカードに加えて、ウェブ上の回線管理ツール（CMP）や、お客さまのシステムとのデータ連携を可能にするAPI、安全にデータを伝送するOpen VPNなどの機能を追加料金なしで利用可能
eSIMやIPSec-VPN（各拠点のLANを相互接続する高セキュリティのネットワーク）などの機能を、有償の追加オプションとして提供
一番の特徴は、IoT回線でよくありがちな基本料金＋従量課金ということではなく、一括で10年間前払いするという部分がとても特徴的ですね。

また今回使ってみるSIM管理プラットフォームについても、2,200円（税込）の中で使用できるということなので、気軽にIoTをプロトタイピングしてみるといった使い方でもできそうです。

尚、1NCE（ワンス）SIMカードでは法人ユーザーであれば、どなたでも１枚から[1NCEショップ](https://shop.1nce.com/portal/shop/)で購入が可能です。

1NCEのSIM回線プラットフォーム自体には、今回使ってみるData Streamer以外にも、REST APIや、IMEIロック、SMS送信、回線無効化、追加チャージなど、回線に関わる操作が一元的に管理できるものなっています。
REST APIについては、また別の記事で紹介してみたいと思います。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/image/.coreimg.100.2000.png/1672888722146/img-1nce-datastreamer-blog-20230112-01.png)

## Data Streamerの概要
今回使用するData Streamer（データストリーマー）の機能概要を確認していきます。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/image_412478331/.coreimg.100.2000.png/1672888776550/img-1nce-datastreamer-blog-20230112-02.png)

### 概要

1NCE プラットフォームで管理されているSIMの回線利用情報を顧客環境にデータストリームとして転送することができる

#### ストリーミングされるデータ
- SIM利用情報（データ＆SMS）
- イベント情報（制御情報）
- メリット

#### リアルタイム性
SIM接続情報解析に使用できる
異常データ量の通知に使用できる
500MBの課金カウント対象に影響なし

#### ストリーミング先として設定できるサービス
AWS Kinesis, AWS S3, Data dog, keen.io, REST API

今回は、構成の検証という意味合いもあるので、データが実際にCSVで貯められるAWS S3を使っていきたいと思います。

## 今回の検証構成
以下の図が今回の検証構成になります。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/image_368031441/.coreimg.100.2000.png/1672889106669/img-1nce-datastreamer-blog-20230112-03.png)

S3にCSVとしてデータを貯めるだけだと、このままだと何が取れているのわかりづらく、今回の目的はあくまでも可視化するということなので、CSVから直接データベースとして参照できるサービス、AWS Athena経由でQuickSight 上に表示してみたいと思います。

### 設定手順：AWS S3でバケットを作成する
ここからは具体的な設定手順になります。

先ずはAWS側にデータの保存先となるS3バケットを作成していきます。

1NCEのホームページ内で公開されているデベロッパーハブで、詳しい設定方法が書いてあるのですが、設定手順としては、[1NCEのGithubでCloudformationのデータが公開](https://github.com/1NCE-GmbH/cfn-templates/tree/main/data-streams-base-stacks)されているものを使うか、もしくは1NCEポータル上から”IAMロールの作成”をクリックして作成していくのが簡単かと思います。

今回は、[1NCEポータル](https://portal.1nce.com/)上からIAMロールを作成していく手順で進めてみますが、Github上のものをダウンロードしても手順は同じになります。

先ずは1NCEポータルにログインして、設定＞Data Stream＞新規のData Streamに進んでいき、”IAMロールの作成”をクリックします。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_47564999/.coreimg.100.2000.png/1672889249387/img-1nce-datastreamer-blog-20230112-04.png)

クリックすると、AWSのCloudFormationにリダイレクトされ、必要なスタック情報が入った状態になります。

今回は検証用なので、デフォルトのまま進めますが、1点だけ注意する部分としてはデフォルトのリージョンがフランクフルトになってしまっているので、この部分だけご自身のリージョンに変更しておきましょう。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1687622950/.coreimg.100.2000.png/1672889279251/img-1nce-datastreamer-blog-20230112-05.png)


その他のパラメータですが、AllowedExternalID とDatastreamerRoleARNを変えてしまうと、CloudFormationがエラーになってしまうので、変更せずにそのまま使ってください。

それ以外の”スタックの名前”、”S3BucketName”は好きなものに変更して大丈夫です。

“CREATE_COMPLETE”のステータスになったら、出力のタブを開いて、”AWSRegion”、”IAMRoleARN”、”S3Bucket”をどこかにコピーしておいてください。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_742513822/.coreimg.100.2000.png/1672889316031/img-1nce-datastreamer-blog-20230112-06.png)

### 設定手順：1NCE ポータルでData Streamerを設定する
次に1NCEポータルに戻って、先ほどコピーしておいた”AWSRegion”、”IAMRoleARN”、”S3Bucket”を貼り付けましょう。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_861591275/.coreimg.100.2000.png/1672889364603/img-1nce-datastreamer-blog-20230112-07.png)

名前については好きなものに変更して大丈夫です。

またS3バケットについては、今回イベントファイルと使用量ファイルのフォルダを別けたかったので、それぞれ/eventと/cdrというフォルダを作っておいています。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy/.coreimg.100.2000.png/1672889392581/img-1nce-datastreamer-blog-20230112-08.png)

あとはこの状態で1NCE SIMをIoTデバイスに差した状態で何か通信を実行すれば、指定したS3バケット内にストリーミングファイルが貯まっていくのが確認できると思います。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_2121305709/.coreimg.100.2000.png/1672889453985/img-1nce-datastreamer-blog-20230112-09.png)


![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1515243802/.coreimg.100.2000.png/1672889466449/img-1nce-datastreamer-blog-20230112-10.png)


因みにファイルの中身ですが、CSVファイルになっており、それぞれ中身はこんな感じで出力されます。


~~~cdr_20221128_0434411.csv

"id","event_start_timestamp","event_stop_timestamp","organisation_id","organisation_name","endpoint_id","sim_id","iccid","imsi","operator_id","operator_name","country_id","operator_country_name","traffic_type_id","traffic_type_description","volume","volume_tx","volume_rx","cost","currency_id","currency_code","currency_symbol","ratezone_tariff_id","ratezone_tariff_name","ratezone_id","ratezone_name","endpoint_name","endpoint_ip_address","endpoint_tags","endpoint_imei","msisdn_msisdn","sim_production_date","operator_mncs","country_mcc"
"xxxxxxxxxxxxxxxx","2022-11-28 04:28:56","2022-11-28 04:33:52","xxxxxxx","xxxxxxxxx","xxxxxxx","xxxxxxxx","xxxxxxxxxxxxxx","xxxxxxxxxxxx","681","SoftBank","100","Japan","5","Data","0.294108","0.057222","0.236886","0.294108","1","JPY","￥","442","1NCE Production 01 - 1Mbps","2173","Rate Zone 3 (RoW)","xxxxxxxxxxxxx","10.208.xxx.xxx",,,"xxxxxxxxxxxxxx","2022-01-17 08:54:06","20","440"

~~~


利用量に関しては、セッションごとのデータ送受信量（tx, rx, total）がわかるようになっています。

~~~event_20221125_093657.csv

"id","timestamp","event_type_id","event_type_description","event_severity_id","event_severity_description","organisation_id","organisation_name","description","alert","event_source_id","event_source_name","endpoint_id","endpoint_name","endpoint_imei","endpoint_ip_address","endpoint_tags","sim_id","sim_iccid","msisdn_msisdn","sim_production_date","imsi_id","imsi_imsi","user_id","user_username","user_name"
"xxxxxxxxxxxxx","2022-11-25 09:36:57","1","Update location","0","INFO","xxxxxxx","xxxxxxxxxxx","New location received from VLR for IMSI=xxxxxxxxxxxxxxxxx, now attached to VLR=xxxxxxxxxxxxx.","0","0","Network","xxxxxxxxxxx","xxxxxxxxxxxxxx","xxxxxxxxxxxxx","10.208.xx.xxx",,"xxxxxxxxxx","xxxxxxxxxxxxxxxxx","xxxxxxxxxxxxxxxxx","2021-03-22 08:17:38","xxxxxxxxx","xxxxxxxxxxxxxxxxxx",,,
~~~

イベントに関しては、セッションごとのイベント情報を確認できるようになっています。

因みにデータを見て分かる通り、Data Streamerで流れてくるデータはあくまでもセッションごとのデータになるので、累計データなどの取得を目的としたものではないということに、注意が必要です。

これで、CSVがS3上に格納できるようになりました。

### 設定手順：AWS Athenaでテーブルを作成する
ここからは、S3バケットに保存されたCSVを読み込んでいきます。

AWSサービス一覧から、Amazon Athenaに偏移させていきます。初めて、Athenaを使うユーザーはクエリ結果をどこに保存するか聞かれると思いますが、環境に合わせて適宜設定してみてください。

因みにAthenaの料金ですが、無料枠は特にないのですが、「スキャンされたデータ 1TB当たり$5.00」になっています。今回の検証構成だと、ほとんどデータサイズもないのですが、1MB当たり換算でも、$ 0.000005 (≒0.000663円、132円換算)ぐらいになります。

先ずはテーブルを作成する必要があるのですが、今回はとりあえずデータ利用量のテーブルだけ作成してみたいと思います。

テーブル作成にはクエリエディタを使って視覚的に作成もできるのですが、今回はSQLコードで作成していきます。

<DATABASE_NAME>、<TABLE_NAME>、s3://xxxxxx<S3-LOCATION>xxxxxxxx部分に関しては、自身の環境に合わせて修正してください。

~~~SQL:
CREATE EXTERNAL TABLE IF NOT EXISTS `<DATABASE_NAME>`.`<TABLE_NAME>` (
  `id` bigint,
  `event_start_timestamp` string,
  `event_stop_timestamp` string,
  `organisation_id` int,
  `organisation_name` int,
  `endpoint_id` int,
  `sim_id` string,
  `iccid` string,
  `imsi` string,
  `operator_id` int,
  `operator_name` string,
  `country_id` int,
  `operator_country_name` string,
  `traffic_type_id` int,
  `traffic_type_description` string,
  `volume` float,
  `volume_tx` float,
  `volume_rx` float,
  `cost` float,
  `currency_id` int,
  `currency_code` string,
  `currency_symbol` string,
  `ratezone_tariff_id` int,
  `ratezone_tariff_name` string,
  `ratezone_id` int,
  `ratezone_name` string,
  `endpoint_name` bigint,
  `endpoint_ip_address` string,
  `endpoint_tags` string,
  `endpoint_imei` string,
  `msisdn_msisdn` string,
  `sim_production_date` string,
  `operator_mncs` int,
  `country_mcc` int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
   )
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://xxxxxx<S3-LOCATION>xxxxxxxx'
TBLPROPERTIES ('classification' = 'csv', 'skip.header.line.count'='1');
~~~

因みにS3の場所に関しては、S3バケットの名前を入れる感じになります。今回は利用量ファイルとイベントファイルのフォルダを別けているので、正確には以下のようになります。

~~~
s3://xxxxxx<S3-LOCATION>xxxxxxxx/cdr
~~~
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1766271381/.coreimg.100.2000.png/1672894331700/img-1nce-datastreamer-blog-20230112-11.png)

ここまで出来たら、あとは実際にデータがSQLクエリで取得できるのか試してみましょう。

クエリタブを新しく作成し、以下のSQLを実行してみてください。

※データベース名とテーブル名は環境に合わせて修正

~~~
SELECT * FROM "<DATABASE_NAME>"."<TABLE_NAME>";
~~~

以下のようにクエリ結果が正しく表示されていれば、成功です。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_574325556/.coreimg.100.2000.png/1672894473875/img-1nce-datastreamer-blog-20230112-12.png)

これで、AthenaからCSVを読み込む準備ができました。

### 設定手順：AWS QuickSightでAthenaのデータセットを設定する
これが最後の手順になります。

AWSサービス一覧から、今度はQuickSight に偏移させていきます。

初めてQuickSight を利用する方は、アカウントタイプを選択するように言われるかもしれませんが、今回の構成であればエディションについてはスタンダードで大丈夫です。

ちなみに、初回利用から1か月間は無料枠がついています。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1553935005/.coreimg.100.2000.png/1672894545754/img-1nce-datastreamer-blog-20230112-13.png)

アカウントの準備ができたら、左側のメニュータブからデータセットを選択し、”新しいデータセット”をクリックしていきます。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1959711454/.coreimg.100.2000.png/1672894589882/img-1nce-datastreamer-blog-20230112-14.png)

データソース名を適当なものに変えて、データソースを作成していきます。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_8331736/.coreimg.100.2000.png/1672894632417/img-1nce-datastreamer-blog-20230112-15.png)

先ほどAthenaで作成したデータベースとテーブルを選択して、次に進みます。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_841791065/.coreimg.100.2000.png/1672894651666/img-1nce-datastreamer-blog-20230112-16.png)

これで、QuickSight からAthenaを経由して、CSVをSQLクエリできるようになりました。

左側のフィールドリストに、Athenaで作成したテーブルのカラムが確認できるはずです。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1092235501/.coreimg.100.2000.png/1672910702781/img-1nce-datastreamer-blog-20230112-17.png)

このカラムから適当にいくつかフィールドを選択すると、右側にグラフが表示されるようになるはずです。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_161094831/.coreimg.100.2000.png/1672910750040/img-1nce-datastreamer-blog-20230112-18.png)

## 実際に可視化されたQuickSight レポート
それでは最後にデータ使用量をSIM単位で見やすいように成形したQuickSight のグラフを作ってみました。

CSVだけだと何とも意味のないデータになってしまいますが、こうやって可視化することで、異常がデータ通信がないかどうかというのをリアルタイムに確認することができますね。
![alt](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy_1069527247/.coreimg.100.2000.png/1672910794517/img-1nce-datastreamer-blog-20230112-19.png)


## 最後に
今回は1NCE SIMで取得したデータ使用量のCSVファイルを使って、SIMデータ使用量を可視化してみました。

今回の検証した構成以外にも、AWS Kinesisなどを使ってデータをリアルタイムに分析し、閾値を超えた使用量を検知した場合に、ユーザーに通知なんて使い方も出来るかと思いますが、それはまた今後の検証で試していきたいと思います。

今回の記事のポイントとしては、以下の点になります。

- 1NCE SIMのData Streamerを使えばリアルタイムのセッションデータを取得できる
- QuickSightなどのBIツールを使って可視化することができる

1NCE SIM管理プラットフォームの機能は、SIM1枚から購入したユーザーであれば誰でも無料で試すことができますので、先ずは是非触ってみてください。

[この記事の詳細はこちら](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-datastreamer/)