AWSのスイッチロール用URL生成ツールswitcherを作ったら意外と好評だったのでご紹介です。
リリースページから各OS用のバイナリが取得できるので、お試しください。
モチベーション
現職では、プロダクトごとにAWSアカウントを分けて管理を行っています。
また、プロダクトによっては本番環境とステージング環境でアカウントを分けるようにプロダクトもあります。
このようにAWSアカウントを複数使用する状況では、ユーザー管理をどう行うか工夫が必要です。
愚直にアカウント毎にユーザーを作成してしまうと、ユーザーの管理が煩雑になってしまうし、多くのアカウントを使い分けるSRE等はMFAの管理が大変なことになってしまいます。
そこで、よく用いられる運用方法としては、大本となるAWSアカウントに各エンジニアのIAMユーザーを作成し、
各プロダクト側でSwitch Roleの権限を付与する、という形があります。
この運用方法であれば、ユーザーは1対のID/Passと1つのMFAデバイスの設定でマネジメントコンソールへアクセスが可能です。
課題
しかし、2、3個程度のAWSアカウントであれば、ブックマークやドキュメントにSwitchRole用のURLを記述しておけば十分なのですが、
SREのように何十個もAWSアカウントを切り替える必要がある場合、ブックマークを作成するだけでも大変です。
switcher
そこで、switcherというCLIツールを作成しました。
なぜ、CLIツールなのかというと、AWSアカウントを多数使うSRE等は総じてTerminalを常に開きTerminal中心の生活を送っているからです。
特徴
~/.switcherrc.json
という設定ファイルにSwitchRole用のアカウント情報を記述します。
[
{
"name": "roleA",
"roleName": "roleA",
"account": "99999999",
"color": "red"
},
{
"name": "roleB",
"roleName": "roleB",
"account": "88888888",
"color": "blue"
}
]
SwitchRole時には切り替え後に表示される名前や色を指定できるので、それらも指定できるようにしてあります。
実装に関して
golang製です。
ktr0731/go-fuzzyfinderというインクリメンタルサーチ機能をgolangから簡単に利用できるライブラリを同僚から教えていただいたので、これを活用しています。
以下に実装の一部抜粋を記載します。
こんな感じで第一引数に渡した配列に対して、インクリメンタルサーチが実現できます。
第二引数にはサーチ対象となる文字列を返す関数、
第三引数にはプレビューに表示する文字列を返す関数を指定することができます。
index, err := fuzzyfinder.Find(
accounts,
func(i int) string {
return accounts[i].Name
},
fuzzyfinder.WithPreviewWindow(func(i, w, h int) string {
return fmt.Sprintf(strings.Repeat("\n", h-10)+"%s\n\naccount: %s\nroleName: %s\ncolor: %s",
accounts[i].Name,
accounts[i].Account,
accounts[i].RoleName,
accounts[i].Color)
}))
if err != nil {
log.Fatal(err)
}
その他
今回は後学のために、golang製CLIツールのディレクトリ、パッケージ構成のベストプラクティスを模索しながら作成してみました。
- Go Moduleを利用した依存ライブラリ管理
- goreleaserを利用した複数環境のバイナリ生成 + GitHubへのリリース
- gobumpを利用したセマンティックバージョンのインクリメント
- Makefileを利用した依存管理、ビルド、リリース作業のタスク定義
自分の中でのgolang製CLIツールのベストプラクティスが固まったので、GitHubのテンプレート機能用にリポジトリを用意しました。
他人が直接このリポジトリをテンプレートに使うことはできませんが、forkしたリポジトリならテンプレートに指定できるので、気になった方は試して見てください!
おわりに
快適なAWSライフを!