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
執行錯誤的動作