Playwrightを使って複数アカウントのAWSコンソールへ自動ログインする
概要
- Playwrightを利用して、AWSの複数アカウントの同時ログインを行う。
- ログイン操作は2FAも含めて自動化する。
背景
まず先に、今回のツールはこちらで公開しています。
前職で複数クライアントの受託開発を行っており、開発+保守で複数のAWSアカウントを行き来することが多く、ログイン操作が手間になっていたため、自動化したいと思いました。
実はすでにSeleniumを使用してツールを作成しており、同時ログインや自動化は達成できていたのですが、WebDriverのインストールやアップデートが面倒だったり、SeleniumよりPlaywrightの方が動作が軽いという情報もあったので切り替えてしまおうと思いました。
また既存のツールは2FAの自動入力は対応しておらず、ワンタイムパスワードの入力は手入力で行っており、MFAデバイスもスマホのGoogle Authenticatorを利用して行ってました。
セキュリティ観点としてはその方が良いかと思いますが、今回は怠惰にこの部分も自動化しました。
課題
- SeleniumからPlaywrightへの移植
- ワンタイムパスワードの生成や登録
実装
すでにSeleniumの実装はあったので、Playwrightへの移植はOpenAIのAPIを使用してコード変換しました。
そこまで複雑なものでもないので、必要なライブラリのインストールや多少変更を加えただけで、問題なく動かすことができました。
ワンタイムパスワードは otplib というライブラリを使用しました。
AWSでMFAデバイス登録時に生成されるシークレットキーを引数で渡せるようにしたメソッドを持つモジュールを作成しました。
こちらはMFAデバイス登録時と、自動ログイン操作時に使われる想定になります。
ワンタイムパスワードを生成する際のコマンドはnpm runで実行できるコマンドを2種類用意しました。
単発でパスワードを取得するコマンドと、AWSでのMFA登録時にパスワードを2回入力する必要があるため、1秒ごとにwatchできるコマンドを用意しました。
使い方
設定の詳細はGithubリポジトリのREADME.mdを参照ください。
ここでは使い方の流れを紹介します。
(1) 環境変数にアカウント情報を設定する
(2) AWS IAMのMFAデバイスの割り当てからシークレットキーを取得する
(3) 環境変数にシークレットキーを設定する
(4) ワンタイムパスワードを発行する
$ npm run opt:watch -- AWS_SAMPLE_SECRET
でAWSコンソール上に表示された6桁の数値を入力します。
(5) ログインコマンドを実行する
$ npm run aws -- SAMPLE &
ブラウザが起動してログインできれば成功です。
ブラウザごとにセッションが独立しているので、複数アカウントに同時にログインすることも可能です。
結果
Selenium で実装されていたものと比べると、確かに動作が軽い気がします。
セットアップも簡単になったので移行としては成功かと感じています。
参考資料
特になし
Discussion