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,有點像是 XPathjQuery 的搜尋資料結構的語法,只是他是針對 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 這樣來稱呼。

延伸閱讀 (站內)

參考資料



Comments

  • 全站索引
  • 學習法則
  • 思考本質
  • 一些領悟
  • 分類哲學
  • ▲ TOP ▲