1NCE（ワンス）IoT SIMのAPIを使ってデータ残量をAWS QuickSightで可視化してみる


この記事では、2022年10月26日から日本で事業開始した低容量IoT回線、1NCEのSIM回線のSIM管理プラットフォームで無償で使える1NCE APIを使って、各SIMカードの残量データを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カードでは法人ユーザーであれば、どなたでも１枚からWEBで購入が可能です。

1NCEのSIM回線プラットフォーム自体には、REST APIや、IMEIロック、SMS送信、回線無効化、追加チャージなど、回線に関わる操作が一元的に管理できるものになっています。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/image_copy_copy_copy_791349952/.coreimg.100.2000.png/1673944266176/img-1nce-api-sim-usage-quicksight-blog-20230119-01.png)

## 1NCE APIの概要
今回使用する1NCE APIの概要についても少し触れておきます。

### 1NCE APIカテゴリ

+ Authorization（認証）
    + API接続のために必ず必要なアクセストークンを取得する（１時間で失効する）
+ SIM Management（SIM管理）
    + SIMの使用状況の取得、トップアップ操作、利用上限の設定などが可能
+ Order Management（オーダー管理）
    + SIM購入履歴の取得、購入操作
+ Product Information（製品情報）
    + 購入できるSIM種類を取得
+ Support Management（チケット管理）
    + アカウントに紐づいているチケット履歴、チケット作成が可能（返信はできない）
+ 1NCE OS（ソフト開発ツール）
    + データ変換、保管、位置情報など顧客側のIoTシステム開発の補助となるようなAPIを準備（2023年1月リリース予定）

またAPIを使う際に使う際の注意として、以下のコール数の制限があることにも注意しておきましょう。

| エンドポインt | APIコール上限 |
|:-:|:-:|
| 認証API<br>/oauth  |  無制限 |
| SIM管理API<br>/sims  | 無制限 |
| オーダー管理API<br>/orders  |  単一IPアドレスから100コール/5分間 |
|  製品API<br>/products | 単一IPアドレスから100コール/5分間  |
| サポートAPI<br>/support  | 単一IPアドレスから100コール/5分間  |

また1NCE APIの利用は基本無料にはなりますが、あまりにも大規模かつ高頻度のコールを行ってしまうと、システム稼働に影響が出る可能性があると注意書きされていますので、実際の設計の際には注意もしくは事前に1NCEサポートに相談する必要はありそうですね。

## 今回の検証構成と検証背景
それでは改めて、今回の検証構成になります。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/image_737176963_copy/.coreimg.100.2000.png/1673944611727/img-1nce-api-sim-usage-quicksight-blog-20230119-02.png)

また、そもそもの今回の構成背景ですが、1NCE SIMを特に企業の管理部門で実際のデータ残量などを管理する際に、デフォルトの状態だと1NCE ポータルに入って、ダッシュボードでサマリだけを確認するか、もしくは各SIMのページに行って、確認するかしか方法がありませんでした。

各SIMの残量を手っ取り早く一目で確認したいのであれば、個別にシステムを準備してデータ残量を定期的にAPIで取得すればいいわけですね。

### 想定事例

SIMの使用状況（データ残、SMS残）を一括で取得したい

### 解決方法

SIMのICCIDを利用して、SIM１枚毎にAPIで残容量を取得する

因みに今回はEC2にAPIを叩かせていますが、小規模の構成であればAWS Lambdaなどに叩かせれば完全にサーバーレスのシステムを構築することが可能です。但しLambdaは、VPC上に配置しないとRDSに到達できなかったり、逆にVPC上の置くと外部のAPIを叩くためにはNAT-GWを配置したりしなくてはならなくなり、構成が複雑になるので、今回はできるだけシンプルな構成にしています。

## 設定手順
ここからは実際の構築手順になりますが、インフラ構築部分は本記事の本筋ではないので、簡単に飛ばしていきます。

### EC2とRDSを作成する
今回はEC2はAPIに叩かせて、RDSにSQLを書き込まれればいいだけなので、適当なEC2をPublicサブネットに配置して、RDSに到達できるようにセキュリティグループを設定しておきます。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_copy/.coreimg.100.2000.png/1673944812675/img-1nce-api-sim-usage-quicksight-blog-20230119-03.png)

またQuickSightからRDSにアクセスする際に、RDSがPrivate subnetにおいてあると、QuickSightで１つの上のサブスクリプション（エンタープライズプラン）が必要になってきます。

もしコストを節約したいのであれば、RDSをPublic subnetにすれば、スタンダードプランでアクセスが可能です。但しその場合は、RDSのセキュリティグループを適切なものに制限しておく必要があります。

[VPC 内の Amazon RDS インスタンスへのアクセスの手動での有効化](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/rds-vpc-access.html)
[AWS リージョン、ウェブサイト、IP アドレス範囲、エンドポイント](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/regions.html)


因みに今回はRDSは、phpmyadminのインポート機能を使いたかったので、MySQLで作成しています。

### RDSにテーブルを作成する
次にRDSにテーブルを準備していきます。

1. ポータル内にあるICCIDリストをエクスポートする
2. テーブルを作成する

#### ポータル内にあるICCIDリストをエクスポートする
先ずは、[1NCEポータル](https://portal.1nce.com/)にログインしていきますが、エクスポートする前に出力データを調整しておきます。

表示列の調整をクリックして、不要なデータをチェックを外しておきます。今回はICCIDとIMSIだけで良いので、それ以外のチェックを外します。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy/.coreimg.100.2000.png/1673945280416/img-1nce-api-sim-usage-quicksight-blog-20230119-04.png)

表示列の調節ができたら、My SIM＞SIMリストをのエクスポートをクリックします。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1818481136/.coreimg.100.2000.png/1673945300960/img-1nce-api-sim-usage-quicksight-blog-20230119-05.png)

出力するデータが多いと時間がかかることがあるみたいですが、数分待つと同じ画面の”SIMリストのエクスポート”部分でファイルがダウンロードできるようになります。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_134001187/.coreimg.100.2000.png/1673945354488/img-1nce-api-sim-usage-quicksight-blog-20230119-06.png)

ダウンロードしたものの中身を見てみましょう。

ファイル名はCSV（カンマ区切りファイル）になっていますが、記述方法はTSV（タブ区切り）方式になっているので注意しましょう。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1288832653/.coreimg.100.2000.png/1673945394913/img-1nce-api-sim-usage-quicksight-blog-20230119-07.png)

今回は、このエクスポートされたファイルをそのままphpadminなどでSQLで読み込ませたいので、以下のようなテーブルを作成していくことにします。

テーブル形式

~~~SQL
MySQL > CREATE TABLE sim_data (ICCID varchar(30), IMSI varchar(30), PIN int, PIN2 int, PUK int, PUK2 int, data_volume int, sms_volume int, data_total_volume float, sms_total_volume float);

MySQL > describe sim_data;
~~~

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1815925324/.coreimg.100.2000.png/1673945590736/img-1nce-api-sim-usage-quicksight-blog-20230119-08.png)

#### RDSにSIMリストを入力する
RDSの準備ができたら、早速テーブルにSIMデータを作成していきます。

SIMのICCIDリストも、APIで１つずつ呼び出すことも可能ですが、SIMカードが勝手に何枚も増えていくことは早々ないので、この部分はマニュアルで実施していきます。
1NCEポータルからダウンロードしたTSVファイル（タブ区切り）のファイルをExcelなどで開いて、SQL文に書き換えていきます。

~~~SQL
INSERT INTO sim_data ICCID, IMSI, PIN, PIN2, PUK, PUK2, data_volume, sms_volume, data_total_volume, sms_total_volume) VALUES (値1, 値2,...);
INSERT INTO sim_data ICCID, IMSI, PIN, PIN2, PUK, PUK2, data_volume, sms_volume, data_total_volume, sms_total_volume) VALUES (値1, 値2,...);
INSERT INTO sim_data ICCID, IMSI, PIN, PIN2, PUK, PUK2, data_volume, sms_volume, data_total_volume, sms_total_volume) VALUES (値1, 値2,...);
INSERT INTO sim_data ICCID, IMSI, PIN, PIN2, PUK, PUK2, data_volume, sms_volume, data_total_volume, sms_total_volume) VALUES (値1, 値2,...);
~~~

あとはこれをphpadminで読み込ませるか、MySQLコマンドで実行させるなどで、テーブルに入力していきます。

こんな感じでデータが入力できたら、データベースの準備が完了しました。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1589978004/.coreimg.100.2000.png/1673945698824/img-1nce-api-sim-usage-quicksight-blog-20230119-09.png)

### 1NCE APIでデータ＆SMS残量を取得＆SQL書込みをするコードを作成する
あとはEC2でコードを書いていきます。コードの中身の説明は詳しくは説明しませんが、Pythonにて以下のことをさせています。
1. 認証コードの取得
2. ICCIDリストの取得
3. データ残量の取得とデータ更新
4. SMS残量の取得とデータ更新

そもそもAmazon LinuxにはPythonが入っていないので、Pythonも併せてインストールしておきます。

~~~bash
$ yum install gcc openssl-devel bzip2-devel libffi-devel wget sudo tar make
$ cd /opt 
$ sudo wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz
$ sudo tar xzf Python-3.9.6.tgz
$ cd Python-3.9.6 
$ sudo ./configure --enable-optimizations 
$ sudo make altinstall
$ sudo rm -f /opt/Python-3.9.6.tgz
$ python3.9 -V
$ echo 'alias python=python3.9' >> ~/.bashrc
$ source ~/.bashrc
~~~

また今回は、API出力の構文解析用にPythonのrequests、RDSとの接続用にmysql.connectorのライブラリを使っていますので、事前に以下コマンドでインストールしておいてください。

~~~bash
$ pip install requests
$ pip install mysql.connector
~~~

これで環境準備が整いましたので、あとはコードを書いていきます。

基本は[1NCE APIガイド](https://help.1nce.com/dev-hub/reference)の通りの記述になりますが、注意したいのは認証トークンが1時間しか有効になっていないので、基本的に1日1回だけ動かすようなコードの場合には、毎回コードを取得するように記述してあげる必要があります。

また認証トークンを取得する際のハッシュ値に関しては、[1NCE APIガイドにて取得する](https://help.1nce.com/dev-hub/reference/postaccesstokenpost)ことが可能です。

~~~python:## sim_data_api.py

import requests
import sys
import mysql.connector as mydb

# 環境に合わせて修正する
rds_host  = <rds_access_point_name>
name = <rds_user>
password = <rds_password>
db_name = <rds_database_name>

try:
    conn = mydb.connect(host=rds_host, user=name, passwd=password, database=db_name)
except:
    sys.exit()

conn.autocommit = False
cur = conn.cursor()

## Get_access_token　認証コードの取得

token_url = "https://api.1nce.com/management-api/oauth/token"

payload = {"grant_type": "client_credentials"}
headers = {
    "accept": "application/json",
    "content-type": "application/json",
    "authorization": "Basic <1nce_api_user+password_hash>" # ポータルで作成したAPIユーザー＆パスのハッシュ値に差替える
}

response = requests.post(token_url, json=payload, headers=headers)
jsonData = response.json() # Access_token

authorization_token = 'Bearer' + ' ' + jsonData['access_token']

## ICCIDリストの取得　もしDBから取得する場合はここを修正する

iccid_list = [
        8xxxxxxxxxxxxxxxxxxx3,
        8xxxxxxxxxxxxxxxxxxx4
        ]

for iccid in iccid_list:

    ## データ残量の取得とデータ更新

    url = "https://api.1nce.com/management-api/v1/sims/" + str(iccid) + "/quota/data"

    headers = {
            "accept": "application/json",
             "authorization": authorization_token
        }

    response = requests.get(url, headers=headers)

    usage_data = response.json()

    try:
        sql = "update sim_data set data_volume = " + str(usage_data['volume'])  + ", data_total_volume = " + str(usage_data['total_volume']) +  " where ICCID = " + str(iccid) + ";"
        cur.execute(sql)
        conn.commit()

    except:
        conn.rollback()

    ## SMS残量の取得とデータ更新

    url = "https://api.1nce.com/management-api/v1/sims/" + str(iccid) + "/quota/sms"

    headers = {
            "accept": "application/json",
             "authorization": authorization_token
        }

    response = requests.get(url, headers=headers)

    usage_sms = response.json()

    try:
        sql = "update sim_data set sms_volume = " + str(usage_sms['volume'])  + ", sms_total_volume = " + str(usage_sms['total_volume']) +  " where ICCID = " + str(iccid) + ";"
        cur.execute(sql)
        conn.commit()
    except:
        conn.rollback()

cur.close()
conn.close()
~~~

コードが書けたら、早速実行させてみましょう。

~~~bash
＄python3 ~/.sim_data_api.py
~~~

データベースの方を見て、正しくデータが更新されていれば成功です。

### スケジューリングさせておく
あとは、このコードを定期的に実行させるように、EC2に設定していきます。
今回はお手軽にcrontabに記述して、毎晩23時59分にファイルを実行させるようにしておきます。

事前に実行権限を正しく設定しておくことを忘れずにしておきましょう。

~~~bash
$ sudo crontab -e
59 23 * * * /usr/bin/python3 /home/xxxxxx/sim_data_api.py
~~~

これでデータベースの準備が全て完了しました。

### QuickSightからにRDSをデータセットとして設定する
あとはQuickSightからRDSをデータセットとして登録していくだけです。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1349045943/.coreimg.100.2000.png/1673946157196/img-1nce-api-sim-usage-quicksight-blog-20230119-10.png)

QuickSightを開いて、”新しいデータセットを追加”を選択し、RDSをクリックします。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1642267149/.coreimg.100.2000.png/1673946202682/img-1nce-api-sim-usage-quicksight-blog-20230119-11.png)

データソース名は適当なものを入力し、データベース名、ユーザー、パスワードは自身の環境にあったものを選択していきます。

QuickSightのサブスクリプションがスタンダードの場合は、パブリックネットワークのものしか選択できませんので注意してください。

![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1796858966/.coreimg.100.2000.png/1673946227317/img-1nce-api-sim-usage-quicksight-blog-20230119-12.png)

あとは作成したテーブル名が選択できるようになっていれば、設定完了です。

### 実際に可視化されたQuickSight レポート
実際に可視化できるようになったQuickSightでのレポートを確認してみます。
![](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/_jcr_content/root/responsivegrid/container_756300796/container/columncontainer_1814/par_1/container/container_358621049/image_765835032_copy_1070838368/.coreimg.100.2000.png/1673946294171/img-1nce-api-sim-usage-quicksight-blog-20230119-13.png)


今回は、ICCIDを2枚しか指定していないので、2枚のみが更新されていますが、コードのICCIDリスト部分をDB読込にするなどすれば、全SIMをループでデータ書き換えすることができますね。

## 最後に
今回は1NCE APIでSIMのデータ残量、SMS残量のデータを取得し、DBに書き込み、そしてそのデータを可視化してみました。

今回の検証した構成以外にも、EC2部分をAWS Lambdaにしてサーバレスにしたり、データ残量を分析してユーザーにアラームを出したりなどすることもできますね。

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

+ 1NCE APIを使うことで、データ＆SMS残量を一括で取得することができる
+ QuickSightなどのBIツールを使って可視化することができる

1NCE（ワンス）SIMカードでは法人ユーザーであれば、どなたでも１枚からWEBで購入が可能で、今回紹介した1NCE SIM管理プラットフォームの機能は、アカウントユーザーであればであれば誰でも無料で試すことができますので、先ずは是非触ってみてください。

この記事の詳細は[クラウドテクノロジーブログ](https://www.softbank.jp/biz/blog/cloud-technology/articles/202301/1nce-api-sim-usage-quicksight/)にて