😀

WindowsとcliでSORACOM Arcを試してみた

2021/06/23に公開

これは

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と組み合わせて簡単にハンズオンもできますね!

GitHubで編集を提案

Discussion