フォーム読み込み中
2023年1月20日掲載
2025年1月6日更新
この記事では、2022年10月26日から日本で事業開始した低容量IoT回線、1NCEのSIM回線のSIM管理プラットフォームで無償で使える1NCE APIを使って、各SIMカードの残量データをAWS QuickSight上で可視化する方法を紹介します。
(2025年1月6日更新)
2024年10月に一部API仕様が変更されたため、APIコール数上限を更新しました。
そもそも1NCE(ワンス) IoT回線というもの自体がまだまだ新しいものなので、簡単に特徴をまとめてみます。
一番の特徴は、IoT回線でよくありがちな基本料金+従量課金ということではなく、一括で10年間前払いするという部分です。
また今回使ってみるSIM管理プラットフォームについても、2,200円(税込)の中で使用できるということなので、気軽にIoTをプロトタイピングしてみるといった使い方でもできそうです。
なお、1NCE(ワンス)SIMカードでは法人ユーザーであれば、どなたでも1枚からWEBで購入が可能です。
1NCEのSIM回線プラットフォーム自体には、REST APIや、IMEIロック、SMS送信、回線無効化、追加チャージなど、回線に関わる操作が一元的に管理できるものになっています。
今回使用する1NCE APIの概要についても少し触れておきます。
1NCE APIカテゴリ
また、APIを使用する際には、以下のコール数の制限があることにも留意しておきましょう。
エンドポイント | APIコール上限 |
|---|---|
認証API /oauth | 無制限 |
SIM管理API /sims | 1アカウントごとに10コール/秒 |
オーダー管理API /orders | 単一IPアドレスから100コール/5分間 |
製品API /products | 単一IPアドレスから100コール/5分間 |
サポートAPI /support | 単一IPアドレスから100コール/5分間 |
また1NCE APIの利用は基本無料にはなりますが、あまりにも大規模かつ高頻度のコールを行ってしまうと、システム稼働に影響が出る可能性があると注意書きされていますので、実際の設計の際には注意もしくは事前に1NCEサポートに相談する必要はありそうですね。
(2025年1月6日更新)2024年10月から、SIM管理APIにAPIコール数に制限が追加されたので、コール数上限表を更新しています。実装の際にはご注意ください。
1NCE APIの実装方法については、APIベストプラクティスも併せてご参照ください。
それでは改めて、今回の検証構成になります。
また、そもそもの今回の構成背景ですが、1NCE SIMを特に企業の管理部門で実際のデータ残量などを管理する際に、デフォルトの状態だと1NCE ポータルに入って、ダッシュボードでサマリだけを確認するか、もしくは各SIMのページに行って、確認するかしか方法がありませんでした。
各SIMの残量を手っ取り早く一目で確認したいのであれば、個別にシステムを準備してデータ残量を定期的にAPIで取得すればいいわけですね。
想定事例
SIMの使用状況(データ残、SMS残)を一括で取得したい
解決方法
SIMのICCIDを利用して、SIM1枚毎にAPIで残容量を取得する
因みに今回はEC2にAPIを叩かせていますが、小規模の構成であればAWS Lambdaなどに叩かせれば完全にサーバーレスのシステムを構築することが可能です。但しLambdaは、VPC上に配置しないとRDSに到達できなかったり、逆にVPC上の置くと外部のAPIを叩くためにはNAT-GWを配置したりしなくてはならなくなり、構成が複雑になるので、今回はできるだけシンプルな構成にしています。
ここからは実際の構築手順になりますが、インフラ構築部分は本記事の本筋ではないので、簡単に飛ばしていきます。
今回はEC2はAPIに叩かせて、RDSにSQLを書き込まれればいいだけなので、適当なEC2をPublicサブネットに配置して、RDSに到達できるようにセキュリティグループを設定しておきます。
またQuickSightからRDSにアクセスする際に、RDSがPrivate subnetにおいてあると、QuickSightで1つの上のサブスクリプション(エンタープライズプラン)が必要になってきます。
もしコストを節約したいのであれば、RDSをPublic subnetにすれば、スタンダードプランでアクセスが可能です。但しその場合は、RDSのセキュリティグループを適切なものに制限しておく必要があります。
因みに今回はRDSは、phpmyadminのインポート機能を使いたかったので、MySQLで作成しています。
次にRDSにテーブルを準備していきます。
ポータル内にあるICCIDリストをエクスポートする
テーブルを作成する
先ずは、1NCEポータルにログインしていきますが、エクスポートする前に出力データを調整しておきます。
表示列の調整をクリックして、不要なデータをチェックを外しておきます。今回はICCIDとIMSIだけで良いので、それ以外のチェックを外します。
表示列の調節ができたら、My SIM>SIMリストをのエクスポートをクリックします。
出力するデータが多いと時間がかかることがあるみたいですが、数分待つと同じ画面の”SIMリストのエクスポート”部分でファイルがダウンロードできるようになります。
ダウンロードしたものの中身を見てみましょう。
ファイル名はCSV(カンマ区切りファイル)になっていますが、記述方法はTSV(タブ区切り)方式になっているので注意しましょう。
今回は、このエクスポートされたファイルをそのままphpadminなどで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;
RDSの準備ができたら、早速テーブルにSIMデータを作成していきます。
SIMのICCIDリストも、APIで1つずつ呼び出すことも可能ですが、SIMカードが勝手に何枚も増えていくことは早々ないので、この部分はマニュアルで実施していきます。
1NCEポータルからダウンロードしたTSVファイル(タブ区切り)のファイルをExcelなどで開いて、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コマンドで実行させるなどで、テーブルに入力していきます。
こんな感じでデータが入力できたら、データベースの準備が完了しました。
あとはEC2でコードを書いていきます。コードの中身の説明は詳しくは説明しませんが、Pythonにて以下のことをさせています。
認証コードの取得
ICCIDリストの取得
データ残量の取得とデータ更新
SMS残量の取得とデータ更新
そもそもAmazon LinuxにはPythonが入っていないので、Pythonも併せてインストールしておきます。
$ 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のライブラリを使っていますので、事前に以下コマンドでインストールしておいてください。
$ pip install requests
$ pip install mysql.connector
これで環境準備が整いましたので、あとはコードを書いていきます。
基本は1NCE APIガイドの通りの記述になりますが、注意したいのは認証トークンが1時間しか有効になっていないので、基本的に1日1回だけ動かすようなコードの場合には、毎回コードを取得するように記述してあげる必要があります。
また認証トークンを取得する際のハッシュ値に関しては、1NCE APIガイドにて取得することが可能です。
## 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()
コードが書けたら、早速実行させてみましょう。
$python3 ~/.sim_data_api.py
データベースの方を見て、正しくデータが更新されていれば成功です。
あとは、このコードを定期的に実行させるように、EC2に設定していきます。
今回はお手軽にcrontabに記述して、毎晩23時59分にファイルを実行させるようにしておきます。
事前に実行権限を正しく設定しておくことを忘れずにしておきましょう。
$ sudo crontab -e
59 23 * * * /usr/bin/python3 /home/xxxxxx/sim_data_api.py
これでデータベースの準備が全て完了しました。
あとはQuickSightからRDSをデータセットとして登録していくだけです。
QuickSightを開いて、”新しいデータセットを追加”を選択し、RDSをクリックします。
データソース名は適当なものを入力し、データベース名、ユーザー、パスワードは自身の環境にあったものを選択していきます。
QuickSightのサブスクリプションがスタンダードの場合は、パブリックネットワークのものしか選択できませんので注意してください。
あとは作成したテーブル名が選択できるようになっていれば、設定完了です。
実際に可視化できるようになったQuickSightでのレポートを確認してみます。
今回は、ICCIDを2枚しか指定していないので、2枚のみが更新されていますが、コードのICCIDリスト部分をDB読込にするなどすれば、全SIMをループでデータ書き換えすることができますね。
今回は1NCE APIでSIMのデータ残量、SMS残量のデータを取得し、DBに書き込み、そしてそのデータを可視化してみました。
今回の検証した構成以外にも、EC2部分をAWS Lambdaにしてサーバレスにしたり、データ残量を分析してユーザーにアラームを出したりなどすることもできますね。
今回の記事のポイントとしては、以下の点になります。
1NCE APIを使うことで、データ&SMS残量を一括で取得することができる
QuickSightなどのBIツールを使って可視化することができる
1NCE(ワンス)SIMカードでは法人ユーザーであれば、どなたでも1枚からWEBで購入が可能で、今回紹介した1NCE SIM管理プラットフォームの機能は、アカウントユーザーであればであれば誰でも無料で試すことができますので、先ずは是非触ってみてください。
条件に該当するページがございません