使用 aws cli 找出 EC2 前一週 CPU 使用率低於 20% 小記
OS: container with openSUSE Leap 15.1
上次寫的是 GCP 上面找出 CPU 使用率小於 20% VM
今天來嘗試使用 AWS CLI 找出 EC2 前一週 CPU 使用率低於 20% instance
AWS CLI 環境是使用之前建立的容器環境
之前有跟 AWS 人交流 ( 開 issue 問 ), 還有與 Vinton + Daniel 討論修正
Shell script 內容如下
#!/bin/bash
# Edit by Max 2020/1/23
# AWS 提供參考
# 要有 jq 指令
echo ""
echo "This script will print ec2 which cpu usage < 20 % last week"
echo ""
# 設定 Region
read -e -p "Please enter region name: " -i "ap-northeast-1" region_name
# 設定使用帳戶
read -e -p "Please enter account name: " -i "default" account_name
# 這邊會列出 InstanceId , 但是如果是 fleet 有可能會放在同一行, 然後要加上 --region
# > aws ec2 describe-instances --region ap-northeast-1 --output text --query 'Reservations[*].Instances[*].InstanceId'
INSTANCES=$(aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].InstanceId' --region $region_name --profile $account_name)
# 取出一週前的時間, 輸出如下 2020-01-16T10:51:40Z
START_TIME=$(date +'%Y-%m-%dT%H:%M:%SZ' -d '1 week ago')
# 結束的時間是現在的時間
END_TIME=$(date +'%Y-%m-%dT%H:%M:%SZ')
for instance_id in $INSTANCES
do
# 使用 aws cloudwatch 指令取出 average, 期間固定是 1 week, 將結果儲存到目前目錄下的 aws_ec2_usage.txt
# 輸出範例如下 i-0736b570513ad32cb, 52.50100135020571
average=$(aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --period 604800 --statistics Average --start-time $START_TIME --end-time $END_TIME --dimensions Name=InstanceId,Value=$instance_id --region $region_name --profile $account_name | jq '.Datapoints[].Average')
if [ ! -z "$average" ]
then
echo "$instance_id, $average" >> ./aws_ec2_usage.txt
fi
done
# 算出所有 instance 數量
TOTAL_INSTANCE=$(wc -l ./aws_ec2_usage.txt | cut -d ' ' -f 1)
echo ""
echo "==== EC2 instance usage < 20% last week ===="
echo ""
# 透過 awk 取出 第2欄位( cpu usage % )小於 20的資料, 然後進行排列, 由小到大
awk '{FS=" "} $2 < 20 {print $1,$2}' ./aws_ec2_usage.txt | sort -n -k 2
INSTANCE_CPU_LOWER=$(awk '{FS=" "} $2 < 20 {print $1,$2}' ./aws_ec2_usage.txt | sort -n -k 2 | wc -l)
# 這邊學會 awk 可以透過 -v 的方式將變數傳遞進去 , 感謝 Vinton 與 Daniel 幫忙, 然後設定小數點 2 位數
INSTANCE_CPU_LOWER_PERCENT=$( echo | awk -v lowerNumber="$INSTANCE_CPU_LOWER" -v total="$TOTAL_INSTANCE" '{ printf "%.2f", lowerNumber * 100 / total}' )
echo ""
echo "==== Summary ===="
echo ""
echo "There are $TOTAL_INSTANCE instances last week"
echo "There are $INSTANCE_CPU_LOWER instances use less than 20% cpu"
echo "$INSTANCE_CPU_LOWER_PERCENT % instances use less than 20% cpu"
echo ""
# 刪除暫存檔案
echo ""
echo "==== Clean temp file aws_ec2_usage.txt ===="
echo ""
rm -f ./aws_ec2_usage.txt
直接執行 shell script 就可以
- 會詢問 Region 以及 AWS account
執行結果參考
這樣以後多個小工具參考
也算是又前進一步
~ enjoy it
Reference