aws cliでシェル毎にデフォルトプロファイルの切り替え設定

一般的には、複数のAWSアカウントを持っている場合 `aws configure --profile <profile>` で aws cli の設定をすると思うが、これだとあらゆる aws コマンドを打つたびに `--profile <profile>` オプションでプロファイル名を指定しないといけないのでめんどくさい。

シェル毎に別のプロファイルをデフォルトで指すことができるようにして、tmux のウィンドウ毎にプロファイルを切り替えたい。

関連: [gcloud でシェル毎にプロジェクトの切り替え設定](https://qiita.com/sonots/items/d41fb2de1d49d9cd8933)

# デフォルトプロファイルの切り替え

### AWS_DEFAULT_PROFILE, AWS_PROFILE

`AWS_DEFAULT_PROFILE` および `AWS_PROFILE` 環境変数でデフォルトプロファイルを切り替えられるので、この環境変数をシェル毎に設定しなおせば良い。ツールによってどちらの環境変数が参照されるかまちまちなようなので両方設定しておくと間違いがない。


### 切り替え設定スクリプト

こんな感じになった。

```zsh:.zshrc
# aws switch
export AWS_CONFIG_FILE=$HOME/.aws/config
# export AWS_SHARED_CREDENTIALS_FILE=$HOME/.aws/credentials
function aws-profiles() {
  cat "${AWS_CONFIG_FILE}" | sed -n "s/^\[profile \(.*\)\]$/\1/p"
}
function ex-init() {
  profile="$1"
  if [ -z "$1" ]; then
    echo "ex-init <profile>"
    return 1
  fi
  unset AWS_DEFAULT_PROFILE
  unset AWS_PROFILE
  ex-activate "${profile}"
  ekx-init
}
function ex-activate() {
  profile="$1"
  export AWS_DEFAULT_PROFILE="${profile}"
  export AWS_PROFILE="${profile}"
}
function ex-current() {
  echo "${AWS_PROFILE}"
}
function ex-complete() {
  _values "ex-complete" $(aws-profiles)
}
function ex() {
  profile="$1"
  if [ -z "${profile}" ]; then
    profile=$(aws-profiles | peco)
  fi
  if [ -z "${profile}" ]; then return 1; fi
  ex-activate "${profile}"
  ekx-activate-default
}
compdef ex-complete ex
```

使い方は、以下のコマンドで初期化をして、

```
$ ex-init プロファイル名
```

あとは ex コマンドで切り替える

```
$ ex[TAB] で自動補完
$ ex[ENTER] でpecoによる絞り込み
```

aws cli に加えて [peco](https://github.com/peco/peco) も入れておく必要があります。

# EKS の切り替え

ついでに EKS のクラスタもシェル毎に切り替えられるようにした

### KUBECONFIG

`KUBECONFIG` 環境変数で `$HOME/.kube/config` の場所を変えられるので、この環境変数をシェル毎に設定しなおせば良い

### 切り替え設定スクリプト

```zsh:.zshrc
# kubectl switch
export EKX_CONFIG_DIR=$HOME/.ekx-config
function ekx-init() {
  profile=$(ex-current)
  rm -rf "${EKX_CONFIG_DIR}/${profile}"
  aws eks list-clusters | jq -r '.clusters[]' |  while read cluster; do
    ekx-activate "${profile}" "${cluster}"
    aws eks update-kubeconfig --name "${cluster}"
  done
}
function ekx-activate-default() {
  profile=$(ex-current)
  if [ -d "${EKX_CONFIG_DIR}/${profile}" ]; then
    cluster=$(\ls "${EKX_CONFIG_DIR}/${profile}" | head -n 1)
    export KUBECONFIG="${EKX_CONFIG_DIR}/${profile}/${cluster}"
  else
    unset KUBECONFIG
  fi
}
function ekx-activate() {
  profile="$1"
  cluster="$2"
  export KUBECONFIG="${EKX_CONFIG_DIR}/${profile}/${cluster}"
}
function ekx-current() {
  echo ${KUBECONFIG##*/}
}
function ekx-complete() {
  profile=$(ex-current)
  _values "ekx-complete" $(\ls "${EKX_CONFIG_DIR}/${profile}")
}
function ekx() {
  cluster="$1"
  profile=$(ex-current)
  if [ -z "${cluster}" ]; then
    cluster=$(\ls "${EKX_CONFIG_DIR}/${profile}" | peco)
  fi
  ekx-activate "${profile}" "${cluster}"
}
compdef ekx-complete ekx
```

使い方は、プロファイルは選択されているとして、以下のコマンドで初期化して、

```
$ ekx-init
```

あとは ekx コマンドで切り替える

```
$ ekx[TAB] で自動補完
$ ekx[ENTER] でpecoによる絞り込み
```

# プロンプトに表示する

ex-current と ekx-current を `PROMPT` もしくは `RPROMPT` に良いように表示させてください。

```zsh:.zshrc
PROMPT='あなたのいつもの設定($(ex-current)/$(ekx-current))$ '
```

私の場合は以下のようなプロンプトにしています。

```zsh:.zshrc
function check-shell-command() {
  if [ $? -eq 0 ]; then
    host="%{$fg_bold[green]%}%m%{$reset_color%}"
  else
    host="%{$fg_bold[red]%}%m%{$reset_color%}"
  fi
  echo -e "${host}"
}
function cloud-prompt() {
  unset profile
  unset cluster
  if [ -n "$AWS_PROFILE" ]; then
    local profile="aws:%F{yellow}$(ex-current)%f"
  fi
  if [ -n "$KUBECONFIG" ]; then
    local cluster="eks:%F{green}$(ekx-current)%f"
  fi
  cloud_prompt=($profile $cluster)
  if [ -n "$(echo -e $cloud_prompt)" ]; then
    echo -e "[$cloud_prompt]"
  fi
}
function prompt() {
  check_shell_command=$(check-shell-command)
  cloud_prompt=$(cloud-prompt)
  if [ -n "${cloud_prompt}" ]; then
    echo -e "${cloud_prompt}\n${check_shell_command}$ "
  else
    echo -e "${check_shell_command}$ "
  fi
}
PROMPT='$(prompt)'
```


```
[aws:AWSプロファイル名 eks:クラスタ名]
ホスト名$
```

のような見た目になります。


# ディレクトリに入ったら自動で切り替える

[direnv](https://github.com/direnv/direnv) を入れて、ディレクトリに .envrc ファイルをおいておく

```bash:.envrc
export AWS_DEFAULT_PROFILE=プロファイル名
export AWS_PROFILE=プロファイル名
export KUBECONFIG=$EKX_CONFIG_DIR/プロファイル名/クラスタ名
```