AWS CLI v2とaws-vaultとpecoを使ってプロファイルを選択方式にする

AWS CLI v2 が GA になったので導入してついでに aws-vault を組み合わせてプロファイルを実行時に切り替えるようにしてみました。

aws-vault のインストールや設定は [macOSのAWSクレデンシャル管理](https://qiita.com/Ricordanza/items/c8231c05294138370034) で書いたとおりです。

## 環境
- 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
[公式](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html) の手順に従いインストール。

```
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
$ aws --version
```

## 準備
1. aws-vault にクレデンシャルを登録する
1. クレデンシャルを選択するための sh を用意
1. ~/.aws/profile に credential_process 経由で sh を使ってクレデンシャルを選択

大きくはこの 3 ステップ。

### aws-vaultにクレデンシャルを登録する
[macOSのAWSクレデンシャル管理](https://qiita.com/Ricordanza/items/c8231c05294138370034) を参考に登録してください。

### クレデンシャルを選択するための 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 に保存されているクレデンシャルをそのまま利用する。

```.aws/config
[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 を自動生成する shell でも作ろうかと思います。

### 2020/02/27 追記
shell 作りました。
[aws-vault の登録内容から AWS CLI 設定ファイルを作成する](https://qiita.com/Ricordanza/items/21210924c16bd797a732)