BETA

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

投稿日:2020-02-13
最終更新:2020-02-13

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  

準備

  1. aws-vault にクレデンシャルを登録する
  2. クレデンシャルを選択するための sh を用意
  3. ~/.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 と名付けて任意の場所に保存してください。

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 でも作ろうかと思います。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@ricordanzaの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう