🐚

SORACOM CLI + Power Shellでたくさん(だいたいover 2k~)のSIMを一気に操作する

2023/06/29に公開

やりたいこと

たくさんのSIMに対して同じ操作をしたい時、ユーザーコンソールから実施する場合最大100件表示して、全てのチェックボックスにチェックを入れる方法が一般的です。

1000枚ぐらいであれば気合いで10ページ送ってやることができなくないものの、3~4000枚ぐらいになると30ページ以上送ることになり、まあできなくはないけどやりたくない。
こんな時、便利なのがAPIです。

今回は、今やOSSとなりWindowsユーザーだけでなく、幅広いOSで利用可能なPowerShellを使ってSORACOM CLIでSORACOM APIを実行しながら大量のSIMを捌いていきたいと思います。

準備

もう使えるよっていう人は飛ばしてください。

1. PowerShellをインストール

https://github.com/PowerShell/PowerShell/releases

2. SORACOM-CLIをセットアップ

基本的にこちらの通り。
https://users.soracom.io/ja-jp/tools/cli/getting-started/

2.1. インストール

ご自身の環境に合ったものをどうぞ
https://github.com/soracom/soracom-cli/releases

homebrewな皆様は

brew tap soracom/soracom-cli
brew install soracom-cli

2.2. 認証情報の準備

https://users.soracom.io/ja-jp/tools/cli/getting-started/?tab-2-3=selected#ステップ-2-認証情報を準備する

ここにも書いてある通り、基本的にSAMユーザーの認証情報を使いましょう。ということで、こちら https://users.soracom.io/ja-jp/docs/sam/create-sam-user/ の手順に沿ってやっていきます。
認証キーは無くさないように大事にしまっておきましょう。

2.3. 認証情報の保存

https://users.soracom.io/ja-jp/tools/cli/getting-started/?tab-2-3=selected#ステップ-3-認証情報を保存する

ここまで終わったらSORACOM CLIが使えるようになります。

練習

(だいたいわかってるからはよ本題に入れやという人は飛ばしてください。)
試しに、持っているSIMの一覧を引き出してみましょう。

soracom sims list

こんな感じの、フォーマットで[{"activeProfileId":から始まるJSON配列がベロベロ出てきたら大成功

本番

いよいよここからです。

対象のSIMを選別しよう

SORACOM CLI(API)を使えば、当然全てのSIMに対して何も考えずに同じ処理ができてしまいます。
一方で人間は間違いを犯す生き物です。このブログの通りに何も考えずにやったらなんかミスったぞ(しかも不可逆なやつ)と言われても責任が取れませんので、対象のSIMを選別するプロセスは読者の皆さんの責任でやってもらいたいと思います。

やり方は簡単。

  1. ユーザーコンソールのSIM管理画面右上の「ダウンロード」から一覧のCSVをダウンロード

    からの

    で「ダウンロード」をおしましょう

  2. csvファイルを見て、いらない行を削除!削除!削除!
    csvファイルはエクセルでも開けちゃいますが、数字がおかしくなってしまうのでテキストエディタで開きましょう。
    作業対象外のSIMが含まれる行をとにかく削除していきます。

  3. 削除済のcsvファイルを適当なファイル名で保存します。
    今回はこれ以降、「sims.csv」と呼ぶことにします。

いよいよ本番

この記事を参考にsims.csvから IMSIを抜き出してを配列に入れていきます。
https://qiita.com/empty948/items/3ed0c651708abcfae716
配列に入れたIMSIたちを引数にしてforeachを使ってsoracomコマンドを実行することで一気に操作をしていきます。

csvを配列に入れる

$sims = Import-Csv -Path ./sims.csv

コマンドの配列を作る

#変数(空の配列)を宣言
$commands = @()

#空の配列にコマンドを突っ込んでいきます。
#今回はノーリスクのコマンド "soracom sims get "を実行する呪文(コマンド文字列)を生成していきます!!
foreach($sim in $sims){$commands += "soracom sims get --sim-id " + $sim.simID}

#配列の中身を覗いてみてみましょう
$commands

コマンドを実行する

# $commandsに入っているコマンド文字列を実行していきます。
foreach($command in $commands){Invoke-Expression $command}

遅い?

実行いただいたらわかると思いますが、これをやると1つのコマンドに約1秒程度の時間がかかります。
これをまともに回すと数千枚のSIMを操作するのに何時間もかかることになってしまいます。
実はこのコマンドの裏で毎回authを実行してAPIkeyとtokenを入れているのが原因です。
これらの処理は毎回取得せずに使い回すことが実は可能となっていますのでその方法を使ってみたいと思います。
詳細は以下を参照
https://users.soracom.io/ja-jp/tools/cli/reduce-auth/

こちらをPowerShellでやるとこんな感じです。
まずはauthKeyIdとauthKeyを入手して、変数の中に入れます。

$config = soracom configure get | convertFrom-Json
$auth_key_id = $config.authKeyId
$auth_key = $config.authKey

authKeyとauthKeyIdを使ってAPIキーとAPIトークンを入手(APIキーと APIトークンが含まれるJSONを入手)します。
APIキーと APIトークンの有効期限は '--token-timeout-seconds' 3600 の部分の秒数です。

$auth_info = soracom auth --auth-key-id $auth_key_id --auth-key $auth_key --token-timeout-seconds 3600 | ConvertFrom-Json

先ほど入手したJSONからキーとトークンを$auth_key_id$auth_keyにいれます。

$api_key = $auth_info.apiKey
$api_token = $auth_info.token

これを使ってコマンドを作り直します。

#変数(空の配列)を宣言
$commands = @()

空の配列にコマンドを突っ込んでいきます。先ほどとの違いは、+" --api-key " + $api_key + " --api-token " + $api_tokenが追加されています。
これによって先ほどいちいちAPIキーとAPIトークンを取得する処理がなくなり、ここで付与したAPIキーとAPIトークンの情報を使って実行されることになります。

#APIとトークンを先に付与した状態で実行
foreach($sim in $sims){$commands += "soracom sims get --sim-id " + $sim.simID +" --api-key " + $api_key + " --api-token " + $api_token}

#commandを実行する部分は先ほどと同じです。
# $commandsに入っているコマンド文字列を実行していきます。
foreach($command in $commands){Invoke-Expression $command}


以上です。お疲れ様でした!

Discussion