はじめに

SORACOM Advent Calendar 2019 ふたつめ 20 日目の記事です。

昨日は @kazntree の やさしさあふれる AT コマンド入門 でした。かるた作者の moznion による 頒布のお知らせ と比べるとそのやさしさが際立っていますね。

USB モデムに対して「ショートメッセージ(SMS)送って」とか「USB モデムのメーカーを教えて」などの命令を伝えるためのコマンドが ATコマンド なのです。 — やさしさあふれる AT コマンド入門 - Qiita

ホラ,皆さん生きていると AT+COPS とか AT+CGDCONT とかよく見たり喋ったりするじゃないですか? — 技術書典 7 (く 39D) にて「AT コマンドかるた」を頒布します!!! - その手の平は尻もつかめるさ

どちらもとても尊敬しているエンジニアなのですが、表現に個性が垣間見えて面白いです。

さて、今回は SORACOM API をコマンドラインから使える soracom-cli をさらに便利にする sorashell というツールを作ってみたので紹介です。aws-cli に対する aws-shell のような位置付けです。

sorashell

SORACOM CLI とは前述の通り SORACOM の API をコマンドラインから簡単に呼び出すツールです。jq など他のコマンドと組み合わせることで日々の操作を効率化しやすく、管理する SIM やデバイスが多くなるほど便利になっていきます。 README_ja.md から特徴を抜粋します。

  • API 定義ファイルから自動生成されるので新しい API がリリースされた場合も迅速に対応
  • Go でクロスコンパイルされたバイナリファイルをターゲットの環境にコピーするだけ
  • 指定された引数を元にリクエストを組み立て、SORACOM API を呼び出し、レスポンス (JSON) をそのまま標準出力へ出力
  • bash/zsh completion (引数補完) に対応

もうこれだけで充分に素敵ツールなのですが、たとえば以下のような悩みがありました。

  • --speed-class-filter--tag-value-match-mode オプションに指定する値が分からず ソラコム SIM スピードクラス などで検索したり、コマンドを一旦キャンセルしてヘルプを見てしまう
  • SIM の IMSI や SORACOM Inventory のデバイス ID を結局 SORACOM ユーザーコンソール からコピペでもってきてしまう
  • SIM や Sigfox デバイスの名前で subscribers getsigfox-devices get できるともっと便利なのに
  • 必須オプション覚えられない

そんなときに aws-shell を試してみて、これは便利だなと思い Go の勉強を兼ね作ってみました。

sorashell

補完機能と Fuzzy マッチがとても便利で日々使っています。自分用のはじめての Go プログラムということで荒削りな部分だらけで現時点では macOS のみ対応です。コマンドのパース部分をもっとちゃんと書きたい感じです。

補完を含むターミナル UI は c-bata/go-prompt という素晴らしいライブラリを利用しました。

事前準備

soracom コマンドを os/exec 使って呼び出しているだけですので、使うためには SORACOM CLI のセットアップが必要です。 SORACOM CLI 利用ガイド にステップバイステップで記載されています。

インストール

今のところは Go のインストールとリポジトリのクローン、ビルドが必要です。GitHub Actions などでビルドとリリースを自動化しようと思っていますが、アドベントカレンダーに間に合いませんでした (リポジトリには試行錯誤の残骸あり)。

  1. Go の導入
  2. rakyll/static の導入
    $ go get github.com/rakyll/statik # install rakyll/statik, asset embedder
    
  3. リポジトリのクローン
    $ git clone https://github.com/0x6b/sorashell
    
  4. ビルド
    $ cd sorashell
    $ make
    $ cp ./sorashell /path/to/your/bin/directory
    

使い方

  1. sorashell コマンドを実行するとシェルが立ち上がります。 SORACOM CLI と同じグローバルフラグを使えます。
        --api-key string         Specify API key otherwise soracom-cli performs authentication on behalf of you
        --api-token string       Specify API token otherwise soracom-cli performs authentication on behalf of you
        --coverage-type string   Specify coverage type, 'g' for Global, 'jp' for Japan
    -h, --help                   help for soracom
        --profile string         Specify profile name
    
  2. SORACOM CLI と同じコマンド、引数を受け付けます (最初の soracom は不要)。
  3. Tab キーで補完候補を移動し Space キーで選択します。
  4. Enjoy!

Tips & Tricks

  • コマンド名やオプション名は Fuzzy マッチします。たとえば --speed-class-filter--scf と入力してもマッチします。
  • コマンドの補完候補が出なくなったら -- を入力するとオプションの補完を始めます。
  • --imsi--device-id--resource-id オプションを入力すると、引数の対象となる SIM の IMSI やデバイス ID を取得し補完候補に出します。表示されているすべての文字列 (プランやステータス、名前、モジュールタイプなど) から Fuzzy マッチできます。
  • 必須オプションには説明に (required) と表示されます。
  • 以下のオプションに指定できる補完候補を表示します。
    • SIM ステータス (--status-filter): active, inactive, ready, suspended, terminated
    • SIM スピードクラス (--speed-class-filter): s1.minimum, s1.slow, s1.standard, s1.fast, s1.4xfast, t1.standard, u1.slow, u1.standard
  • 他のコマンドへのパイプ | やファイルへのリダイレクト > が使えます。
  • 先頭に ! を入れると通常のコマンド (!cd /Users/soracom/Desktop!ls など)が実行できます。

パラメーターとしてファイルを引数に取るコマンド (event-handlers create) をうまく処理できていません。(また、私がよく使うコマンド以外はあまりテストできていませんので、バグやご質問は GitHub Issues まで。

まとめ

IoT は管理対象デバイス数が大量になりがちです。API や CLI を日々の業務に取り入れて効率化していきたいですね。

この記事の URL は Amazon Web Services Solutions Architect ブログへのトリビュートです。タイトルや内容は恐れ多くて真似できませんでした。