12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-23

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

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

関連: gcloud でシェル毎にプロジェクトの切り替え設定

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

AWS_DEFAULT_PROFILE, AWS_PROFILE

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

切り替え設定スクリプト

こんな感じになった。

.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 も入れておく必要があります。

EKS の切り替え

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

KUBECONFIG

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

切り替え設定スクリプト

.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 に良いように表示させてください。

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

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

.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 を入れて、ディレクトリに .envrc ファイルをおいておく

.envrc
export AWS_DEFAULT_PROFILE=プロファイル名
export AWS_PROFILE=プロファイル名
export KUBECONFIG=$EKX_CONFIG_DIR/プロファイル名/クラスタ名
12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?