WindowsとcliでSORACOM Arcを試してみた
これは
SORACOM Discovery 2021 Onlieで発表された、SORACOM Arcを試してみたというお話です。
SORACOM Arcとは
ざっくりいうと、仮想SIMを用いて、SORACOMプラットフォームにVPNで接続するサービスです。
これまではBeam,Funk,Funnel,HarvestといったSORACOMの超絶便利な機能を使うにはSORACOM Airで接続するしかなかったわけですが(HarvestはInventory経由が可能なのでちょっと例外)、なんとこれが全て使えるようになります。
詳しくは公式ページをご覧ください。
Windowsで試すには
Windowsでは2021年6月23日現在、公式コマンドsoratunが動きません(WSL2でも動きませんでした。カーネルに権限が足りない?)ので、ここはWireGuardを使います。
公式ページの「Installation」からバイナリを落としてきてインストールします。
仮想SIMとセッションを作る
続いて仮想SIMを作成し、クレデンシャルとセッションを作ります。せっかくなのでリリースされたばかりのCLI v0.10.0を使ってみます。
SORACOM CLI v0.10.0以降をリリースページからダウンロードしてセットアップします。
まずは仮想SIMを作ります。
$ soracom sims create --type virtual --subscription planArc01
{
"activeProfileId": "xxxxxxxxxxxxxxxxxxxx",
"arcSessionStatus": {
"arcAllowedIPs": [
"100.127.0.0/16"
],
"arcClientPeerIpAddress": "xxx.xxx.xxx.xxx",
"arcClientPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"arcServerEndpoint": "xxx.arc.soracom.io:11010",
"arcServerPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxx",
"gtpcTeid": xxxxxxxxxxxxx,
"lastUpdatedAt": xxxxxxxxxxxx,
"location": null
},
.....
"simId": "xxxxxxxxxxxxxxxxxxxx",
"speedClass": "arc.standard",
"status": "active",
"tags": {},
"terminationEnabled": true,
"type": "virtual"
}
$ export SIMID=xxxxxxxxxxxxxxxxxxxxxx
作成するとarcのセッションが同時に作られるようで、arcSessionStatus
という情報が返ってきています。ただし、クレデンシャルを足したあとに一旦リセットしないといけないのでこの情報は使いません。
また、このあと使うのでsimId
の値を環境変数に設定しておきます。
2021年6月25日追記
以下の手順が実は不要であったことに気がつきましたので、末尾の訂正記事をご覧ください。sims create
で戻ってきた情報に含まれるセッション情報とクレデンシャル情報だけでセットアップできます。
追記ここまで
続いて、クレデンシャルを作ります。
$ soracom sims attach-arc-credentials --sim-id $SIMID
{
"arcClientPeerPrivateKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"arcClientPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
そして、クレデンシャルを追加したのでセッションをリセットします。
$ soracom sims create-arc-session --sim-id $SIMID
{
"arcAllowedIPs": [
"100.127.0.0/16"
],
"arcClientPeerIpAddress": "xxx.xxx.xxx.xxx",
"arcClientPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxx",
"arcServerEndpoint": "xxxx.arc.soracom.io:11010",
"arcServerPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
WireGuardの設定をする
WireGuardの設定をします。トンネルの設定を以下のように編集します。
-
PrivateKey
にはattach-arc-credentials
コマンドの戻り値のarcClientPeerPrivateKey
を入れます -
Address
にはcreate-arc-session
コマンドの戻り値のarcClientPeerIpAddress
の後ろに/32
をつけたものを入れます -
PublicKey
にはcreate-arc-session
コマンドの戻り値のarcClientPeerPublicKey
を入れます -
AllowedIPs
にはcreate-arc-session
コマンドの戻り値のarcAllowedIPs
を入れます - EndPointには
create-arc-session
コマンドの戻り値のarcServerEndpoint
をポート番号まで入れます。
ここまでできたら「有効化」を押して、pong.soracom.io
にpingを打ってみましょう。
うまくいきましたね!
一連の流れを実施して設定ファイルを書き出すシェルスクリプトとしてはこんな感じでしょうか。
#!/bin/sh
simId=`soracom sims create --type virtual --subscription planArc01 | jq -r .simId`
privateKey=`soracom sims attach-arc-credentials --sim-id $SIMID | jq -r .arcClientPeerPrivateKey`
session=`soracom sims create-arc-session --sim-id $SIMID`
allowedIPs=`echo $session | jq -r .arcAllowedIPs[0]`
address=`echo $session | jq -r .arcClientPeerIpAddress`
publicKey=`echo $session | jq -r .arcServerPeerPublicKey`
endpoint=`echo $session | jq -r .arcServerEndpoint`
echo "[Interface]"
echo "PrivateKey = $privateKey"
echo "Address = ${address}/32"
echo
echo "[Peer]"
echo "PublicKey = $publicKey"
echo "AllowedIPs = $allowedIPs"
echo "Endpoint = $endpoint"
この出力結果をWireGuardに貼り付ければいけると思います(未検証)
訂正(2021年6月25日追記)
再度確認したところ、最初のsims create
をした時点で既にセッション情報とクレデンシャルが含まれていました。
{
"activeProfileId": "xxxxxxxxxxxxxxxxxxxxxxx",
"arcSessionStatus": {
"arcAllowedIPs": [
"100.127.0.0/16"
],
"arcClientPeerIpAddress": "xxx.xxx.xxx.xxx",
"arcClientPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"arcServerEndpoint": "xxx.arc.soracom.io:11010",
"arcServerPeerPublicKey": "xxxxxxxx",
"lastUpdatedAt": xxxxxxxxxxxxxxxxxxxx
},
......
"profiles": {
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx": {
"arcClientPeerPrivateKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"arcClientPeerPublicKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"iccid": "xxxxxxxxxxxx",
.......
},
........
"type": "virtual"
}
こんな感じですね。なので、シェルスクリプトもこんな感じになります。
-i
オプションで既存のsimIDを渡すとクレデンシャルの追加とセッションのリセットをやり、ない場合は仮想SIMを作ります。
#!/bin/sh
simId="non"
while getopts i: OPT
do
case $OPT in
i) simId=$OPTARG
;;
esac
done
if [ $simId = "non" ]; then
created=`soracom sims create --type virtual --subscription planArc01`
simId=`echo $created | jq .simId`
privateKey=`echo $created | jq -r .profiles.${simId}.arcClientPeerPrivateKey`
session=`echo $created | jq -r .arcSessionStatus`
else
privateKey=`soracom sims attach-arc-credentials --sim-id $simId | jq -r .arcClientPeerPrivateKey`
session=`soracom sims create-arc-session --sim-id $simId`
fi
allowedIPs=`echo $session | jq -r .arcAllowedIPs[0]`
address=`echo $session | jq -r .arcClientPeerIpAddress`
publicKey=`echo $session | jq -r .arcServerPeerPublicKey`
endpoint=`echo $session | jq -r .arcServerEndpoint`
echo "[Interface]"
echo "PrivateKey = $privateKey"
echo "Address = ${address}/32"
echo
echo "[Peer]"
echo "PublicKey = $publicKey"
echo "AllowedIPs = $allowedIPs"
echo "Endpoint = $endpoint"
まとめ
SORACOM Arcは、SORACOM Airを使わずにSORACOMの各種サービスを使えるという超素敵サービスです。デバッグはもちろん、応用範囲は多岐にわたります。Napterと組み合わせてVPNを構築したりも簡単にできそうですね。これからも色々と使ってみたいと思います。
拙作のLTE-M Button Simulatorと組み合わせて簡単にハンズオンもできますね!
Discussion