Usacloud v1.0 - WASM対応や全ゾーン一括操作など様々な改善を含むメジャーバージョンアップ

f:id:febc_yamamoto:20201221102556p:plain
UsaConのメイン画面

はじめに

さくらのクラウド向けCLIUsacloudのメジャーバージョンアップとなるv1.0.0をリリースしました。

github.com

Usacloud v1.0.0ではWebAssemblyに対応しました。このリリースに合わせブラウザ上で手軽にUsacloudを実行できるようにするChrome拡張UsaConもリリースしました。

chrome.google.com

この記事ではUsacloud v1.0とUsaConを紹介していきます。

Usacloud v1.0

さくらのクラウド向けCLIとして2017年3月に初版となるv0.0.1がリリースされました。  

初版のリリースが行われて以降、ご利用いただいた方々からのフィードバックを反映したりさくらのクラウド自体の進化に対応したりと地道にアップデートを重ねてきました。

f:id:febc_yamamoto:20201221103456p:plain
Usacloud 初版(v0.0.1)のリリース

これまでの累計ダウンロード数はGitHub ReleasesやDocker Hubを合計すると延べ10,000を超えました。

Usacloud v0系で不満だった点

私自身日常の作業にUsacloudを利用していたのですが、数年利用している中でいくつか不満を感じるようになってきていました。

例えば、

  • フラグ指定する際に指定する位置に気をつける必要がある
  • 複数のゾーンに跨がる処理の実装が困難
  • bash以外のシェル補完が行えない

というような点です。

例えば1点目は--zone=is1aのような指定をしたい場合、以下のように指定するしないといけないということです。

  • OKな例: usacloud --zone=tk1a server list
  • NGな例: usacloud server list --zone=tk1a

指定忘れに気付いたらヒストリーから呼び出して所定の位置にカーソルを移動して、、というのが地味にストレスでした。
(option+←などのキーボードショートカットやctrl+aで先頭に戻ってから右へ移動とかでもOKなんですがそれもめんどくさい)

これらの問題を解決するには依存ライブラリの切り替えやアップグレードが必要で、Usacloud側も大幅に修正する必要がありましたので メジャーバージョンアップして対応することにしました。

Usacloud v1.0系での改善や主な新機能

前述の細かな不満の解消や新機能の追加などを行なっています。

  • フラグ位置を気にしなくてよくなった
  • 全ゾーン一括操作対応
  • 操作対象リソースの指定にID or 名称 or タグを利用可能に
  • シェル補完でbash/zsh/fish/powershellをサポート(github.com/spf13/cobraのおかげ)
  • いわゆるDry Run機能(libsacloudのFakeドライバーというやつを利用)
  • ヘルプ表示の改善(候補値の表示やパラメータ例の追加など)
  • WebAssembly対応

他にも細かな改善がたくさん行われています。この中からいくつかピックアップして紹介します。

全ゾーン一括操作

--zoneフラグにallを指定することで全ゾーン一括操作が可能となりました。

# 全ゾーンのサーバを一覧表示
$ usacloud server list --zone=all

+------+--------------+---------+------+-----+--------+-----------+----------------+----------------+--------------+
| Zone |      ID      |  Name   | Tags | CPU | Memory | IPAddress | Upstream(Mbps) | InstanceStatus | InstanceHost |
+------+--------------+---------+------+-----+--------+-----------+----------------+----------------+--------------+
| tk1a | 100000000008 | example | -    | 1   | 1      | -         | -              | -              | -            |
| tk1b | 100000000011 | example | -    | 1   | 1      | -         | -              | -              | -            |
| is1a | 100000000012 | example | -    | 1   | 1      | -         | -              | -              | -            |
| is1b | 100000000010 | example | -    | 1   | 1      | -         | -              | -              | -            |
| tk1v | 100000000009 | example | -    | 1   | 1      | -         | -              | -              | -            |
+------+--------------+---------+------+-----+--------+-----------+----------------+----------------+--------------+

# 全ゾーンのサーバのうち、名称にexampleを含むサーバをシャットダウン
$ usacloud server shutdown --zone=all example

# 全ゾーンにサーバ作成
$ usacloud server create --name example ... --zone=all

参照系だけでなく、リソース作成や更新、電源操作なども一括で行えます。

操作対象リソースの指定にID or 名称 or タグを利用可能に

Usacloudはusacloud リソース コマンド 操作対象リソースのような書式となっています。
この中の操作対象リソースの部分はv0系だとID or Nameだったのですが、v1からはタグも利用可能になりました。

# 全ゾーンのサーバのうち、env=stagingというタグがついているサーバを一括シャットダウン
$ usacloud server shutdown "env=staging"

いわゆるDry Run機能

libsacloudにはFakeドライバーという機能があり、さくらのクラウドAPI呼び出しをローカルで擬似的に行えるようになっています。 主にテスト用途での利用を想定したものです。

# dry-run
$ usacloud server create --name example --fake

# 作成したリソースのデータを永続化しておきたい場合は--fake-storeを併用する
$ usacloud server create --name example --fake --fake-store ~/.usacloud/fake_store.json

Fakeドライバーはバックエンドストレージとしてインメモリ/ローカルファイルを選べるようになっており、ローカルファイルを用いればデータの永続化も行えるようになっています。
また、Terraformのさくらのクラウド向けプロバイダーPrometheusのさくらのクラウド向けExporterでもFakeドライバーが利用可能で、 例えばTerraformで作ったリソースをPrometheusで監視しつつUsacloudでリソースのCRUDや電源操作の動作確認、といったことを実際のリソースを作成することなく行えます。

RESTコマンドの追加

上級者向けではあるのですが個人的にお気に入りの機能なので紹介しておきます。

docs.usacloud.jp

さくらのクラウドAPIをUsacloudやAPIライブラリlibsacloudの抽象化を通さずに直接叩くためのコマンドです。

# 特定サーバの電源をOFFにする: https://developer.sakura.ad.jp/cloud/api/1.1/server/#delete_server_serverid_power
$ usacloud rest -X DELETE -d '{"Force":true}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/$ID/power 

# APIルートURLは省略可能
$ usacloud rest -X DELETE -d '{"Force":true}' /server/$ID/power 

# パラメータはファイルからでもOK
$ usacloud rest -X DELETE -d parameter.json /server/$ID/power

curlを直接使えば良い、という感はありますが、APIキーやゾーンの指定は結構面倒なのでなかなか便利です。

WebAssembly(WASM)対応

GOOS=js GOARCH=wasm go buildでビルドできるようになりました。 実行するにはグルーコードが必要ですがnodejs上やブラウザ上でもUsacloudを動かせるようになりました。

# nodejs上でwasmを実行
$(go env GOROOT)/misc/wasm/go_js_wasm_exec usacloud.wasm -v

1.0.0 js/wasm, build c0ceb3ae

せっかくWebAssemblyに対応しましたのでブラウザ上でも動かせるように次で紹介するChrome拡張UsaConもUsacloud v1.0と同時リリースしました。

さくらのクラウドのコントロールパネル上でUsacloudを実行できるChrome拡張UsaCon

f:id:febc_yamamoto:20201222102242p:plain

chrome.google.com

利用方法についてはこちらのドキュメントを参照ください。 docs.usacloud.jp

UsaConは@wasmer/wasm-terminalというコンポーネントを用いて前述のUsacloud v1.0 WASM版を動かせるようにしたものです。 github.com

@wasmer/wasm-terminalXterm.jsComlinkなどを用いた、WASIという規格に対応したWASMをブラウザ上で実行できるコンポーネントなのですが、 これをGoで作成したWASMを実行できるように改修して利用しています。

(この辺の実装の詳細については機会があればどこかに書いておこうと思っています。)

今はストレージもエディタも付属していないのですが、今後BrowserFSみたいなやつでバックエンドをオブジェクトストレージにしてみたり、vim.wasmみたいにエディタを動かせるようにしたりすると面白いんじゃないかなと思っています。(出来るかはまだわかりませんが)

なお、UsaConはAPIキーの保存にCredential Management APIPasswordCredentialを利用していますのでChromeのみのサポートとなっています。 Firefox/Safariのサポートは今のところ出来ていません。Edgeはもしかしたら大丈夫かもしれませんが開発環境が手元にないので対応していません。

UsaConスクリーンショット

f:id:febc_yamamoto:20201221175149p:plain
UsaConでサーバ作成したところ

f:id:febc_yamamoto:20201221175225p:plain
UsaConでサーバの電源をONにしたところ

Usacloud v1.0 / UsaConの注意点

Usacloud v1.0では過去のバージョンと互換性のない変更がいくつか行われています。

例えば(APIで取得できる)全種類のリソースのサマリーを表示するusacloud summaryコマンドやデータベースアプライアンスのログを表示するusacloud database logsコマンドなどの廃止、パラメータ名の変更(--nw-mask-len => --netmask)などです。 Usacloud v0系からアップグレードされる方は前述の--fakeモードなどでDryRunして動作確認してみることをお勧めします。

その他にもいくつか破壊的な変更点があります。網羅的ではありませんがアップグレードガイドを用意していますのでこちらもご一読ください。

docs.usacloud.jp

まとめ

  • 様々な改善が行われたUsacloud v1.0をリリースしました
  • Usacloud v1.0をブラウザ上で動かすためのChrome拡張UsaConをリリースしました
  • Usacloud v1.0にはv0系と互換性のない変更も含まれるためアップグレードの場合は注意が必要

ということで是非ご利用ください。

以上です。