社内向けCLIツールのご紹介
目次
はじめに
忘年会から無事に帰還したゲインです。皆さん飲んでますか?
今回は僕が勝手に作っている便利cliについて簡単ににご紹介です。
概要
207のインフラは基本的にECS on Fargateを使用して構築されています。
単発で終わるコマンドを動かすには aws cliを使用してタスクを起動する必要がありますが、オプションの指定等が複雑です。
copilot cliやecspresso等のサードパーティーのツールを導入もタスクを動かすためだけに導入するのは少々大げさです。
またDBとしてAurora Postgresを使っており,Private Subnetにある都合上ローカルからDBへの接続はできませんが、開発時には好きなクライアントを使用してDBの中を見たいという要求もあるでしょう。
そのためにsession managerを利用してport-forwardを行い接続することも可能となっていますが、やはり接続のためのオプションを指定するのは煩雑です。
そこで社内向けにGoでcli toolを作成し、これらの手順を簡略化しました
機能
ベースの機能として、selfupdateを提供しています。
https://github.com/inconshreveable/go-update というライブラリを使用しバージョンが上がるたびに自動で更新されるようになっています。
毎実行時にs3上に置いてある最新バージョンが書いてあるテキストをダウンロードし、バイナリに埋め込まれたバージョンと比較します。
その際、差分がある場合は最新のcliをバケットからダウンロードし更新を行います。
このときの権限はそれぞれの開発者の権限を使用します。
すでにログインしている場合はその権限を使い、未ログインの場合はCLIの中でaws ssoを行います。
s3側ではOrganization内のユーザーからのみダウンロードできるようにBucket policyを設定しています。
現状のロジックではバージョンの差分がある場合は更新していますが、そこのロジックは自由に変えられるのでマイナーバージョンのみ自動デップデートやメジャーバージョンのアップデートは対話式にするなど柔軟に変更することが可能です。
バージョン用のテキストファイルとバイナリはGitHub ActionsでBuildするタイミングでs3へ配置しています。
runtask
既存のタスク定義を対話的に選択し、任意のコマンドを打つためのサブコマンドです。
引数として実行したいコマンドを入力して実行します。
SecurityGroupやサブネット等は社内の事情に合わせて自動で選択しているため、特に設定を行う必要はありません。
実行後はNewRelicのログやコンソール上からタスクの状態を確認してもらいます。
dbconnect
接続できる環境名を選択し、接続可能なDatabaseを探し出し、そのインスタンスへport-forwardを行うコマンドを実行します。
やってることは aws ssm start-sessionのWrapperなので特に語ることはありません。
現状ではDBへの接続のみが可能ですが、今後Redisや任意のインスタンスへのport-forwardを実現できてもいいかもしれないですね。
まとめ
僕が半分遊びで作っているcliのご紹介でした。
今後も随時アップデートしていきたい所存です!