Help us understand the problem. What is going on with this article?

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

一般的には、複数の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))$ '

とか

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

direnv を入れて、ディレクトリに .envrc ファイルをおいておく

.envrc
export AWS_DEFAULT_PROFILE=プロファイル名
export AWS_PROFILE=プロファイル名
export KUBECONFIG=$EKX_CONFIG_DIR/プロファイル名/クラスタ名
sonots
A Ruby, Fluentd, and Chainer Committer. SRE Engineer. Qiitaは小ネタの投稿場所として利用しています。業務コードで、なぜそういう書き方をしているのか解説をQiitaに書いて、コードにはQiitaへのリンクを張る、という使い方をしていることが多いです(自己紹介じゃない)
https://medium.com/@sonots
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした