AWS CLI v2 が GA になったので導入してついでに aws-vault を組み合わせてプロファイルを実行時に切り替えるようにしてみました。
aws-vault のインストールや設定は macOSのAWSクレデンシャル管理 で書いたとおりです。
環境
- macOS Mojave (10.14.5)
- zsh
- peco
- AWS CLI v2
- aws-vault
これらを組みわせて default プロファイル利用時は設定済みのプロファイルから選択するようにします。
インストール
ここでは、zsh、peco、 AWS CLI v2 のインストール方法について記載。
zsh
今回は brew でインストール。
$ brew install zsh
peco
これも brew でインストール。
$ brew install peco
AWS CLI v2
公式 の手順に従いインストール。
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" $ sudo installer -pkg AWSCLIV2.pkg -target / $ aws --version
準備
- aws-vault にクレデンシャルを登録する
- クレデンシャルを選択するための sh を用意
- ~/.aws/profile に credential_process 経由で sh を使ってクレデンシャルを選択
大きくはこの 3 ステップ。
aws-vaultにクレデンシャルを登録する
macOSのAWSクレデンシャル管理を参考に登録してください。
クレデンシャルを選択するための sh ファイルを用意
aws-vault のプロファイルを列挙するコマンドを利用してクレデンシャルをして peco で選択。
その内容を AWS CLI に渡すというのが大まかな処理の流れ。
以降は aws-vault に prof1、prof2、prof3 の 3 つのクレデンシャルを登録しているという前提で記載します。
自分の環境に合わせて読み替えてください。
まずは、aws-vault で登録しているプロファイルは、aws-vault ls
で列挙できます。
$ aws-vault ls Profile Credentials Sessions ======= =========== ======== default - - prof1 prof1 - prof2 prof2 - prof3 prof3 -
Profile の欄は .aws/config に設定されているプロファイル名、Credentials の欄は aws-vault に登録しているプロファイル名、 Sessions にはクレデンシャルから払い出したセッション情報が表示されます。
Profile と Credentials の突合は単純に同じ名前かどうかで判定している模様。
これの情報を AWK で 整形するとこんなかんじで Credentials だけ抜き出せます。
$ aws-vault ls | awk 'NR>2 {if ($2 != "-") print $2}' prof1 prof2 prof3
これを peco に食わせるとクレデンシャルを選択できるようになります。
セッションを用いずに登録したクレデンシャルを利用する場合は以下のようなコマンドで aws-vault からクレデンシャルを抜き出すことが可能です。
$ aws-vault exec -j `aws-vault ls | awk 'NR>2 {if ($2 != "-") print $2}' | peco --prompt "Choice Credential >"` --no-session Choice Credential > IgnoreCase [3 (1/1)] prof1 prof2 prof3
クレデンシャルを選択するとキーチェーンがロック中の場合はアクセス確認が行われるのでパスワードを入力します。
キーチェーンにアクセスできれば、以下のようにクレデンシャルが表示されます。
{"Version":1,"AccessKeyId":"AKIXXXXXXXXXXXXXXXXX","SecretAccessKey":"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ","SessionToken":""}
これを適当な sh ファイルに仕込んで credential_process に食わせればお終いです。
sh を credential-selector.sh と名付けて任意の場所に保存してください。
credential-selector.sh
echo $(aws-vault exec -j `aws-vault ls | awk 'NR>2 {if ($2 != "-") print $2}' | peco --prompt "Choice Credential >"` --no-session)
.aws/config に credential-selector.sh を組み込む
.aws/config を以下のように編集します。
デフォルトプロファイルは credential-selector.sh で登録済みのプロファイルの一覧から選択。
各プロファイルは aws-vault に保存されているクレデンシャルをそのまま利用する。
[default] credential_process=/PATH/TO/credential-selector.sh region=ap-northeast-1 output=json [profile prof1] credential_process=aws-vault exec -j prof1 --no-session region=ap-northeast-1 output=json [profile prof2] credential_process=aws-vault exec -j prof2 --no-session region=ap-northeast-1 output=json [profile prof3] credential_process=aws-vault exec -j prof3 --no-session region=ap-northeast-1 output=json
.aws/credentials に設定は不要です。空のファイルにしてください。
credential-selector.sh に実行権限を付与したら準備は完了です。
$ chmod +x /PATH/TO/credential-selector.sh
使ってみる
では使ってみましょう。
まずはプロファイル指定を行った場合。
$ aws s3 ls --profile prof1 2019-12-18 12:16:10 bucket-1 2020-01-08 09:21:42 bucket-2
これで普段どおり指定したプロファイルに関連づいた S3 バケットの一覧が表示されます。
次に default プロファイルを指定した場合です。
$ aws s3 ls Choice Credential > IgnoreCase [3 (1/1)] prof1 prof2 prof3
2019-07-18 14:36:41 bucket-a 2019-07-10 18:49:57 bucket-b
このようにクレデンシャルの一覧が表示されるのでそこから利用したいクレデンシャルを選択する事ができます。
まとめ
aws-vault と peco を使って default プロファイル指定時に任意のクレデンシャルを選択できるようにしてみました。
もともと事故防止用に default プロファイルには何も指定をしていなかったのですが、毎回プロファイルを打ち込むのもめんどくさいなーと思うことがあり、選択できるようにしてみました。
aws-vault に登録されているクレデンシャルと .aws/credentials のプロファイルを同期させないと期待した動きをしないので .aws/credentials を自動生成する sh でも作ろうかと思います。