Tech Racho エンジニアの「?」を「!」に。
  • インフラ

naviで運用コマンドチートシートを作る

事業推進チームのtakanekoです。

はじめに

最近(といっても3月ごろですが)、AWS ECSでexecute-commandによるコンテナアクセスが可能になりました。sshログインの代わりとしてよく利用するのですが、コマンドがすごく長いです 💦

execute-commandでbashを起動する例

aws --profile <AWSプロファイル名> ecs execute-command --cluster <クラスタ名> --task <調べるの面倒くさいタスクID> --container app --interactive --command /bin/bash

こういった長いコマンドを複数のプロジェクトで叩き分けるのに疲れたので、navi というチートシートツールを使って簡単に呼び出せるようにしてみました。

naviについて

denisidoro/navi - GitHub

Rust製のチートシートツールです。fzfと組み合わせてインタラクティブにコマンドを呼び出せます。
GitHubのレポジトリからチートシートをimportしたり、独自のチートシートを作ることもできます。

今回は運用特化の独自チートシートを用意して、naviで呼び出すことにします。

チートシート例

実際に使ってるチートシートをいくつか紹介します。

例1) aws ecs execute-command

% dev, aws, common

# aws settings on dev
$ profile: echo "navi"
$ region: echo "ap-northeast-1"
$ clusterName: echo "navi-cluster"
$ containerName: echo "app"

% dev, ecs, execute-command
@ dev, aws, common

# aws ecs execute-command on dev
aws --profile <profile> --region <region> ecs execute-command --cluster <clusterName> --task <taskId> --container <containerName> --interactive --command /bin/bash

$ taskId: aws --profile $profile --region $region ecs list-tasks --cluster $clusterName | jq -r '.taskArns[-1] | split("/")[-1]'

taskIdを割り出すために別のコマンドを指定できます。このコマンドの場合は、list-tasksした結果の一番最後のタスクIDです。

起動中のコンテナでbashを実行

起動中のコンテナでbashを実行

例2) aws logs tail

% dev, aws, common

# aws settings on dev
$ profile: echo "navi"
$ region: echo "ap-northeast-1"

% dev, logs-tail
@ dev, aws, common

# aws logs tail on dev
aws --profile <profile> --region <region> logs tail --follow <logGroupName>

$ logGroupName: aws --profile $profile --region $region logs describe-log-groups | jq -r .logGroups[].logGroupName

ロググループ名を割り出してtailするコマンドです。logGroupNameに複数候補あるとき、fzfで絞り込むことができます。

logStreamから選択してtailする

logStreamから選択してtailする

$で変数の設定をしないときは、入力待ち状態になります。

% dev, aws, common

# aws settings on dev
$ profile: echo "navi"
$ region: echo "ap-northeast-1"

% dev, logs-tail, input
@ dev, aws, common

# aws logs tail on dev(logGroupNameは入力する)
aws --profile <profile> --region <region> logs tail --follow <logGroupName>

;comment out
;$ logGroupName: aws --profile $profile --region $region logs describe-log-groups | jq -r .logGroups[].logGroupName

logStream名を入力している

logStream名を入力している

例3) 特定のdocker volumeだけ消す

ローカル開発時の便利コマンド集としても使ってます。

% docker, volume, rm

# docker volume rm 
docker volume rm <dockerVolume>

$ dockerVolume: docker volume ls --- --header-lines 1 --column 2

docker-volume-rm

docker-volume-rm

プロジェクト別にチートシートを分けたいときの設定

プロジェクト別に叩きたいコマンドが微妙に違ったりするので、NAVI_PATH環境変数を利用してチートシートの探索パスを切り替える設定を組み込みました。

naviとfzfをインストールした後、以下のように設定します。

~/.bashrc

# ctrl+gでnaviを実行
eval "$(navi widget bash)"

# レポジトリからimportするcheat sheetのパス
export NAVI_PATH="$(navi info cheats-path)"

# ~/.cheats = 自分用かつ横断的なチートシートのパス
# .cheats = プロジェクト別チートシートのパス(相対パス)
export NAVI_PATH="~/.cheats:.cheats:$NAVI_PATH"

~/.config/git/ignore

# プロジェクト別チートシートはコミットしない
.cheats

NAVI_PATH環境変数に相対パスを設定すれば、カレントディレクトリから探索してくれます。
この設定の場合、プロジェクトのルートディレクトリから以下のような構成でチートシートを配置すれば、このディレクトリにいるときだけ呼び出せるコマンド群になります。

構成例

<project-root>
`- .cheats
   |- dev.cheat # dev環境のコマンドシート
   |- stg.cheat # stg環境のコマンドシート
   |- prod.cheat # prod環境のコマンドシート
   `- local.cheat # ローカル開発環境用のコマンドシート

(※ プロジェクトルートにcdしないと呼び出せないという欠点はありますが、私はそこまで気になりませんでした)

使ってみて良かった点・悪かった点

良かった点

  • ctrl+g押して何文字か打てば長いコマンドがパッと呼び出せて便利
  • タスクIDとかログストリーム名といった、覚えられない情報を調べるコマンドを組み込めるのがよい

悪かった点

  • チートシートを作る際にシェル芸が発生するので、達人でなければ時間がかかる
  • プロジェクト別チートシート設定を使うと、同じようなチートシートを何度も作るので面倒くさい
    • profileとかclusterNameを入力項目にすると汎用性が高くなるが、実行までのステップは増えるので好みが分かれそう

おわりに

日々のコマンド実行で少しでも楽をしたい、というお話でした。
「こうしたらもっと楽だぜ」みたいな方法あったらぜひ教えて欲しいです 🙇‍♂️

「コマンドを叩く」と心の中で思ったなら、その時スデに行動が終わっているレベルになりたい。



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。