はじめに
SORACOM Napterは,SIM入りデバイスをインターネットに晒すことなくリモートから接続可能にする便利なサービスですが,Napter経由でリモート接続する際にはその都度ポートマッピングを作成する必要があります。
コンソールから作成することも可能ですが,毎回コンソールにログインして画面操作するのは非常に手間がかかります。そんな時に便利なのが,SORACOMが提供しているAPI。これを使ってスクリプトを書けば,コマンド一つでポートマッピングの作成からリモートデバイスへの接続までできてしまいます。
さらにSORACOM CLIも使えばより簡単にAPIが叩けるんですが,そっちの記事はもうあるので,今回は敢えてCLIを使わないとどうなるのか,お見せしようと思います。
SORACOM Napterをcliから使ってみる - Qiita
CLIを入れるかどうか迷ってる方は,是非見比べて参考にしていただければと思います。
前提条件
接続先デバイスに入っているSORACOM SIMに名前が付けられていること
スクリプトの実行環境でjqコマンドが使えること
コード
napter.sh
# APIキーとトークンを取得
read API_KEY TOKEN <<(curl -s -X POST -H "Content-Type: application/json" \
-d '{"email": "*****", "password": "*****"}' https://api.soracom.io/v1/auth \
| jq -r "[.apiKey,.token]|@tsv")
# 操作したいSIMのIMSIを取得
IMSI=$(curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" \
-H "X-Soracom-Token: ${TOKEN}" https://api.soracom.io/v1/subscribers \
| jq -r '.[] | select(.tags.name=="*****") | .imsi')
# ポートマッピングを作成
curl -s -X POST -H "Content-Type: application/json" \
-H "X-Soracom-API-Key: ${API_KEY}" -H "X-Soracom-Token: ${TOKEN}" \
-d "{\"destination\": {\"imsi\": ${IMSI}, \"port\": 22}, \"duration\": 28800, \"tlsRequired\": false}" \
https://api.soracom.io/v1/port_mappings
# ポートマッピングが作成されていることを確認
echo ''
curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" -H "X-Soracom-Token: ${TOKEN}" \
https://api.soracom.io/v1/port_mappings | jq ".|length"
# NapterのエンドポイントのIPアドレスとポート番号を取得
IFS=: read ADDRESS PORT <<(curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" \
-H "X-Soracom-Token: ${TOKEN}" https://api.soracom.io/v1/port_mappings \
| jq -r ".[]|select(.imsi==\"${IMSI}\")|.endpoint")
# IFSを元に戻す
IFS=$' \t\n'
ssh -p $PORT pi@$ADDRESS
SORACOMアカウントのメールアドレス,パスワード,SIMの名前,ポートマッピングの有効期限(duration),ラズパイ側のユーザ名などは適宜置き換えてください。
基本的には,curlでAPIを叩いた結果から必要な値をjqで取り出す仕組みになっています。curlの戻り値から必要な値を取り出して変数に格納する方法については,以前書いたこちらの記事をご参照ください。
「cURLで取得したJSONの複数フィールドを別々の変数に格納する」を1行で - Qiita
「ポートマッピングが作成されていることを確認」のところでは,現在有効なポートマッピングの数が表示されます。
環境変数IFSは引数を分割するための区切り文字(デリミタ)で,デフォルトではスペース,タブ,改行になっています。NapterのエンドポイントをAPIで取得すると192.168.0.1:22のような形で返ってくるため,IFSを:に書き換えることによってアドレスとポート番号をreadで別々の変数に格納することができます。
readコマンドで1つの文字列から複数の変数に代入するとき - j3iiifn’s blog
ただし,IFSを変更したままだと他のコマンドの挙動に影響してしまうため,用が済んだら忘れずに元に戻す必要があります。
おわりに
シェルにちょっとだけ詳しくなりました。あとjqって偉大だなーと思いました。
参考
Getting Started: IoT デバイスに SSH ログインする | SORACOM Napter | SORACOM Users
はじめに: API キーと API トークン | SORACOM API 利用ガイド | SORACOM Users
リファレンス: SORACOM API リファレンス | SORACOM API 利用ガイド | SORACOM Users
jq コマンドを使う日常のご紹介 - Qiita
↧