これは Google Cloud Platform その2 Advent Calendar 2018 21日目の記事です。
作ったもの
インタラクティブUIを備えたcbtベースのBigtable用CLI btcli を作りました。
モチベーション
GoでClean Architecture導入とDual WriteによるDB移行をした話 にある通り、現在はBigtableをメインに使っているプロダクトで開発を行っています。Bigtableはチョッパヤでめちゃくちゃスケールするので非常に便利で僕も大好きなプロダクトです。
手元でBigtableのデータを読み書きするには公式で cbt というものが用意されていて、最低限必要なものは揃っています。
先の記事でも言及していますが、Bigtableのincrement関数を使うためには8byteビッグエンディアンにエンコードした値を使う必要があります。ところがcbtでは文字列としてでしか値を表示することが出来ません。内部的にはデータはbyteで保存されていて、型による区別がないため当然といえば当然ですが、人間が扱うときには少し困ります。
当初はビッグエンディアンのデコード機能をcbtにモンキーパッチを当てて使っていましたが、もう少しリッチなクライアントが欲しくなり作ったのが btcli です。ちなみに名前はmycliからインスパイアしました。
出来ること
インタラクティブな補完
ほぼ全て go-prompt のおかげで実装出来ています。
豊富なフィルタオプション
現在 read
サブコマンドで以下のオプションが使用可能です。
read <table> [args ...]
start Start reading at this row
end Stop reading before this row
prefix Read rows with this prefix
value Read rows with has value
family Read only columns family with <columns_family>
version Read only latest <n> columns
from Read cells whose version is newer than or equal to this unixtime
to Read cells whose version is older than this unixtime
decode Decode big-endian value
decode-columns Decode big-endian value with columns. <column_name:<string|int|float>[,<column_name:...>]
これだけあると大体の場合において事足りない感じがしています。全てのフィルタは網羅出来ていませんが、需要ベースで追加しているので、ここにないフィルタや機能があったらカジュアルに追加しています。もし欲しいものがあればissues, PRお待ちしております。
また冒頭に書いていたdecodeオプションもここに用意しています。 decode
が全体設定、 decode-columns
が個別設定でこちらのほうが優先度高い感じです。環境変数 BTCLI_DECODE_TYPE
を設定することでデフォルトの decode
オプションを指定することも出来ます。
出来ないこと
write系のコマンドは自分自身あまり使ったことが無いので実装していません。
インストール方法
go get
で入ります。調子に乗ってmodule化したので環境変数 GO111MODULE
が必須です。
go get -u github.com/takashabe/btcli/cmd/btcli
まとめ
インタラクティブUIを備えたcbtベースのBigtable用CLI btcli を作りました。
実際に仕事でも使っていて、チームでも好評なので作ってよかった感があります。まだまだやりたいことがあるので時間を見つけては開発を続けていきたいと思っています。
ユースケースが合致する方はぜひ使ってみてください!