🐌

SORACOM CLI + Power ShellでVPGのデバイスLAN設定を移行する

2024/01/24に公開

やりたいこと

SORACOM Gateを使うと、クラウドからデバイス(Gate C2D)またはデバイスからデバイス(Gate D2D)に対してIPアクセスすることができるようになります。
この時、デバイス(SIM)に振られたIPアドレスを使用してアクセスしますが、VPGにIPアドレスマップの設定を行うことで、デバイス(SIM)に振られるIPアドレスを固定することができます(逆にこれをやらない場合、DHCP的にIPアドレスが振られてしまいます)。

この設定がされたVPGを何らかの理由で別のVPGに移行したい場合に、ユーザーコンソールから実施すると、SIMのIMSIとIPアドレスとの対応を一つ一つ手入力で実施する必要が出てきてしまい、すでに大量の設定がしてあるVPGを移行するのは大変な作業になってしまいます。

今回のブログではこの設定をSORACOM CLIを利用して効率的に実施していきたいと思います。

準備

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

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配列がベロベロ出てきたら大成功

本番

いよいよここからです。
移行後のVPGは作成済みの前提です。

vpgの情報を確認して変数に入れる

カバレッジタイプを選んでおきます。
以下は日本カバレッジの例(plan-D,plan-Kなどを使っている場合)

$coverage = "jp"

グローバルカバレッジのサブスクリプション(plan01s,planP1,planX3など)を使っている場合は、"g"としましょう。

左上ハンバーガーメニューから「メニュー」 -> 「SORAOM AIR FOR セルラー」 -> 「VPG
でVPGの一覧を表示。

移行前/後のVPGのIDを確認しましょう。

確認したらクリップボードにコピーして、変数(vpg_id_before,vpg_id_after)に入れていきましょう。

$vpg_id_before="<コピーした移行元のVPGのID>"
$vpg_id_after="<コピーした移行先のVPGのID>"

移行前のIPアドレスマップ情報を取得する

soracom vpg list-ip-address-map-entriesコマンドを使います。

コマンドの結果はJSONで帰ってくるので、扱いやすい形にパースしてentriesという変数に入れます。

$entries = soracom vpg list-ip-address-map-entries --vpg-id $vpg_id_before --coverage-type $coverage| ConvertFrom-Json

コマンドを実行したら中身を確認してみます。

$entries

以下のような感じで出ていればOKです。

このうちtypeがstaticとなっているエントリがIPアドレスマップに関する設定となっています。

新しいVPGに設定を追加

APIKeyとtokenを使いまわせるように変数に入れる

今回使用するコマンドは、実行するたびに API キーと API トークンを発行します。また、今回は1回コマンド実行で、1つのエントリしか設定できないため、 SORACOM CLI のコマンドを複数回実行する必要があります。そのためスクリプトの開始時に 1 回だけ soracom auth (Auth:auth API) を実行して API キーと API トークンを発行し、それらを再利用することで全体の実行時間を短縮できます。

まずは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

デバイスに対するIPアドレスマッピングの設定のみ抽出してそのエントリーを設定する

typeがstaticになっているエントリーでフィルタリングします。

 $filteredEntries = $entries | Where-Object { $_.type -eq "static" }

soracom vpg put-ip-address-map-entryコマンドを使います。ただし、このコマンドは1エントリーずつしか設定できないので、foreachを使います。
念の為、エラーが発生したらループを止めるようにします。

# 進捗カウントのリセット
$successCount = 0

foreach ($entry in $filteredEntries) {
   $body = @{
       ipAddress = $entry.ipAddress
       key = $entry.key
   } | ConvertTo-Json

   try {
       # コマンド文字列の作成
       $command = "soracom vpg put-ip-address-map-entry --body '$body' --vpg-id '$vpg_id_after' --coverage-type '$coverage' --api-key '$api_key' --api-token '$api_token'"

       # 作成したコマンドを実行
       $output = Invoke-Expression $command

       # 正常なレスポンスかどうかを確認
       $responseJson = $output | ConvertFrom-Json
       if ($responseJson.ipAddress -eq $entry.ipAddress -and $responseJson.key -eq $entry.key) {
           $successCount++
           # 進捗表示
           Write-Host "成功したエントリの数: $successCount / $($filteredEntries.Count)"
       } else {
           Write-Host "エラー: レスポンスの ipAddress または key が一致しません。"
           break # 一致しない場合、ループを中断します
       }
   }
   catch {
       Write-Host "エラーが発生しました: $($_.Message)"
       break # エラーが発生した場合、ループを中断します
   }
}

実行結果の例

Discussion