Ops as Code with AWS CLI
整理一些利用 AWS CLI
作維運工作的例子,像是:
- 根據 Tag 條件,定期刪除不需要使用的 EC2 Instances
- 根據 Tag 條件,將 EC2 Instances 定期備份成 AMI / Snapshot
- 統計 EC2 使用狀況。
另外還有 AWS CLI
的使用心得,目的就是達到 Ops as Code
。
EC2 維護
列舉幾個 系統維運 (System Operations) 常用做的週期性任務。
流程上我都會利用 Tag: ops:<key>
做控管,這個 tag 會定義像是:
- ops:backup: true | false
- ops:status: retired | in-used
- ops:ri: 採購 Reserved Instance?
- ops:createdAt: AMI/Snapshot 建立的時間,用來判斷之後是否刪除
備份 AMI
將 EC2 備份成 AMI,同時標記 Tag,可以後續處理。
這邊有特別下 --no-reboot
,就是避免將 EC2 重開機,預設會關機後才做。
1
2
3
4
5
6
7
8
9
10
11
12
|
ts=`date +%Y%m%d-%H%M`
ami_id=`aws ec2 create-image \
–-instance-id “$instance_id” \
–-name “$instance_name-$ts” \
–-description “$instance_name-$ts” \
–-no-reboot \
–-output text`
# 建立 tags
aws ec2 create-tags \
–-resource ${ami_id} \
–-tags Key=ops:createdAt,Value=`date +%Y-%m-%d_%H-%M`
|
自動刪除標記的 EC2 Instance
依據 Tag ops:status
的狀態,找出準備被刪除的機器,然後跑回圈刪除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
TAG=“ops:status”
VALUE=“retired”
# 找出標記 retire 的機器
aws ec2 describe-instances \
–query ‘Reservations[*].Instances[*].[InstanceId]’ \
–filters Name=tag:$TAG,Values=$VALUE\
–output text |
while IFS= read -r item
do
# 把 termination protection 關掉
aws ec2 modify-instance-attribute \
–instance-id $item \
–no-disable-api-termination
# terminate EC2 instance
aws ec2 terminate-instances –instance-ids $item
done
|
如此只要把排程設定好,像是一週一次,然後維運人員透過 AWS Console 定期 review 資源狀況,標記不需使用的,然後就不用管了。
更完整的是:
- 報表產出:這些資源會在刪除前一天,自動彙整成報告,透過 Email and Slack 送給使用單位以及使用者,並在刪除後自動送出報表。
- 預算摘要:刪除前後自動結算資源的預算共節省多少,將報表送給主管以及相關單位人。
統計 EC2 使用狀況
因為機器數很多,有時候需要知道知道週期性的開關機器狀況,利用以下方法,排成蒐集資訊,然後畫圖表知道目前機器使用狀況。
1
2
3
4
|
aws ec2 describe-instances \
–query “Reservations[*].Instances[*].[[Tags[?Key==’Name’].Value][0][0],InstanceId,InstanceType,State.Name]” \
–filters Name=tag:Name,Values=Web* Name=instance-state-name,Values=running \
–output text
|
這邊用了比較複雜的 JEMSPath 查詢,主要就是查詢 json 資料結構,然後找到需要的關鍵字,這個例子找的條件 (–filer) 是:
- tag:Name=Web*
- instance-state-name=running
最後將資訊留下來,同時 pipe 給 wc
計算
AWS CLI 常用的參數
以下是我比較常用的:
--output
:輸出的資料格式,有json
,text
,table
三種。如果是寫成 script 記得帶 text,不然 script parse json 會讓人抓狂--query
:查詢 json 的方法,AWS CLI 支援 JEMSPath,有點像是XPath
、jQuery
的搜尋資料結構的語法,只是他是針對 json--filter
:等同於 AWS Console 上的 tag 搜尋。跟--query
搭配很好用,這兩個就像是 SQL 的SELECT Columns
+WHERE Conditions
,可以找到大概七八成以上的資訊。--profile
:切換不同的 AWS Profile,也可以直接讀~/.aws/config
,但有多個時,這個參數就很好用。--region
:跟--profile
一樣。--dry-run
:測試、試跑 AWS CLI。這個不是最上層的參數,要看 service。
其他可以做的
- 自動將重要的 AMI 備份到另一個 Region for DR
- 將常用的 server 類別,像是 DB/Web/Batch 等機器的建置需求,整理成 CLI 管理。
- 透過 AWS CLI 管理 IAM Policy, Group, Role, User.
這個我正在做
- 蒐集 CloudWatch 資料,放到其他地方,像是 ELK.
- 透過 AWS CLI call EC2 Run Command,做系統安全性的升級。
- 備份資料到 S3,或者從 S3 拿到機器裡處理。我們 Log 就是用這個做法。
- 可以透過
tag
標記的資源,大部份都可以透過 AWS CLI 做處理。
後記
DevOps
概念都流行起來了,不是都在用 Cloud 了,怎麼還在養寵物呢?不就當牲畜好了?
恩,這些我都知道,不過每家公司,都有自己的文化以及歷史包袱,這些想法,大部份是在新創,且初期的公司才會發生。
現實往往跟理想是有距離的,而且 NoOps
不是啥都沒有,而是用其他方法,轉嫁給 Cloud Provider 而已。
其實 operations 不只是針對 EC2 這種比較花錢的東西,還有很多關於資安和權限管理的部分,這部分也都是可以用 AWS CLI 做,同時可以做版本控管,所以我才會用 Ops as Code
這樣來稱呼。
參考資料