事業推進チームの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について
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です。
例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で絞り込むことができます。
$
で変数の設定をしないときは、入力待ち状態になります。
% 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
例3) 特定のdocker volumeだけ消す
ローカル開発時の便利コマンド集としても使ってます。
% docker, volume, rm
# docker volume rm
docker volume rm <dockerVolume>
$ dockerVolume: docker volume ls --- --header-lines 1 --column 2
プロジェクト別にチートシートを分けたいときの設定
プロジェクト別に叩きたいコマンドが微妙に違ったりするので、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
を入力項目にすると汎用性が高くなるが、実行までのステップは増えるので好みが分かれそう
おわりに
日々のコマンド実行で少しでも楽をしたい、というお話でした。
「こうしたらもっと楽だぜ」みたいな方法あったらぜひ教えて欲しいです 🙇♂️
「コマンドを叩く」と心の中で思ったなら、その時スデに行動が終わっているレベルになりたい。