星期四, 1月 23, 2020

使用 aws cli 找出 EC2 前一週 CPU 使用率低於 20% 小記

使用 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

沒有留言: