一般的には、複数のAWSアカウントを持っている場合 aws configure --profile <profile>
で aws cli の設定をすると思うが、これだとあらゆる aws コマンドを打つたびに --profile <profile>
オプションでプロファイル名を指定しないといけないのでめんどくさい。
シェル毎に別のプロファイルをデフォルトで指すことができるようにして、tmux のウィンドウ毎にプロファイルを切り替えたい。
関連: gcloud でシェル毎にプロジェクトの切り替え設定
デフォルトプロファイルの切り替え
AWS_DEFAULT_PROFILE, AWS_PROFILE
AWS_DEFAULT_PROFILE
および AWS_PROFILE
環境変数でデフォルトプロファイルを切り替えられるので、この環境変数をシェル毎に設定しなおせば良い。ツールによってどちらの環境変数が参照されるかまちまちなようなので両方設定しておくと間違いがない。
切り替え設定スクリプト
こんな感じになった。
# 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
の場所を変えられるので、この環境変数をシェル毎に設定しなおせば良い
切り替え設定スクリプト
# 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
に良いように表示させてください。
PROMPT='あなたのいつもの設定($(ex-current)/$(ekx-current))$ '
私の場合は以下のようなプロンプトにしています。
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 ファイルをおいておく
export AWS_DEFAULT_PROFILE=プロファイル名
export AWS_PROFILE=プロファイル名
export KUBECONFIG=$EKX_CONFIG_DIR/プロファイル名/クラスタ名