Preface
如果有想要透過 Command Line Interface 來管理 AWS 帳號的人,應該都會有參考這篇官方的Configuring the AWS CLI 來設定相關的工具與環境。
這邊簡單做個快速的概括,想要在 Shell 上面操作 AWS 帳戶的話,要執行下列的動作
- 下載並且安裝 awscli (可以透過 pip 安裝)
- 設定 AWS Profile
對於一般使用 AWS 通常到這一個步驟就差不多完成了,能夠將帳戶給設定完成並且使用 aws 相關的指令來存取公有雲上的資源。
然而對於部分企業或是使用者來說,基於商業/安全/其他考量,可能會有多組 AWS 的帳號,要如何在 Shell 中方便且快速地切換不同的 AWS 帳號則是一個有趣的問題。
接下來會跟大家分享我自己是如何管理多組 AWS 帳號的
Introduction
再開始探討如何切換多組 AWS 帳號前,我們要先瞭解 aws cli 本身是怎麼運作的。
aws cli 本身有兩個檔案用來處理帳號的基本設定以及相關的認證資訊, 分別是
$HOME/.aws/config 以及 $HOME/.aws/credential
其中 $HOME/.aws/config 裡面的格式大概是
[default]
region = us-west-1
output = json
[profile Account1]
region = us-west-1
output = json
[profile Account2]
region = us-west-1
output = json
[default]
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxx
[Account1]
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxx
[Account2]
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxx
當執行 aws 指令時,若沒有特別指定 PROFILE 的名稱,則會使用 default
這一組的資訊來存取,否則就會根據其名稱來尋找特定的數值
Usage
有了上述的概念後,接下來來看一下要如何設定 aws cli。
- 執行時帶入參數
--profile來指定要使用的PROFILE - 透過環境變數
AWS_PROFILE來指定要使用的PROFILE
Solution
以(1)為範例的話,我們可以透過所有的指令都要補上 --profile 來使用,但是這種方式使用上會變成你所有指令都要確保有加上該參數,實務上我個人是沒有很喜歡,覺得管理上比較麻煩。
譬如
aws iam list-roles --profile Account1
aws iam list-roles --profile Account2
aws iam list-roles --profile Account3
如果今天有一些客製化的腳本,變成腳本中所有的指令都要注意有使用到這個參數,對於一個多人維護的腳本來說,我覺得被忽略的可能性非常高
以(2)為範例的話,就是每次使用前要確保當前的環境變數是什麼,這種情況下每個指令的使用就可以盡量簡單,讓呼叫者自己去確保該指令的面對對象
export AWS_PROFILE=account1
aws iam list-roles
AWS_PROFILE=account2 aws iam list-roles
套入環境變數的方法滿多種的,上述的方式都可以將該環境變數傳遞到 aws 的指令列中
但是使用這個方法的困難處就在於預設的情況下,你有時候會不知道自己到底當前是什麼樣的 Profile, 這時候就可以搭配 shell prompt 去客製化顯示當前的 AWS_PROFILE 是什麼。
為了解決這個問題,其實可以修改自己習慣使用的 shell 設定檔,搭配一些自行撰寫的 shell function 來動態調整當前的 AWS_PROFILE 環境變數,並且將當前的數值顯示在 shell 的提示命令列上。
就在我完成該功能沒多久後,就發現其實 oh-myzsh 內建的 plugin 有一個幾乎完全一樣的實現功能,這意味其實我根本不需要自己寫,直接啟動該 plugin 即可
oh-my-zsh aws
Usage
打開該 aws 套件後,使用上大概會是如下
<aws:Account1>╭─hwchiu@hwchius-MBP ~
╰─$
使用指令 asp 搭配 tab 可以列出目前所有設定過的 aws profile
<aws:LFCORD>╭─hwchiu@hwchius-MBP ~
╰─$ asp
Account1 Account2 Account3 Account4
同時該 aws plugin 也會幫忙設定安裝 aws aws_zsh_completer, 意味你可以透過 tab 的方式來更方便的使用 aws cli
Configuration
基本上參考 on-my-zsh 的設定方式,先到 $HONE/.zshrc 中將 plugin 的選項加入 aws 即可,譬如
...
# Which plugins would you like to load?
# Standard plugins can be found in ~/.oh-my-zsh/plugins/*
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git aws)
source $ZSH/oh-my-zsh.sh
...
這邊有一個要注意的是,預設的 aws plugin 使用的是 RPROMPT 而非 PROMPT, 這意味他的顯示會是在畫面最右邊,而非左邊。
此外也要注意妳選用的 theme 會不會幫你把 PROMPT 給蓋掉,導致功能失效。
譬如我選擇的主題是 bira,所以 PROMPT 以及 RPROMPT 都會被覆蓋掉導致 aws plugin 不會成功。
因此我最後還是自己修改 $HOME/.zsrhc 來處理
...
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
PROMPT='$(aws_prompt_info)'"$PROMPT"
詳細的更多實作可以直接參閱 $HOME/.on-my-zsh/plugin/aws 裡面的介紹
藉由這個套件的幫助,我平常就會使用 asp 來切換不同的 AWS Account, 同時透過 shell PROMPT 來知道當前使用的 PROFILE,避免在不同的 Account 執行錯誤的動作