星期四, 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

星期三, 1月 22, 2020

REST Client extension with vscode 小記

REST Client extension with vscode 小記

起因
  • Chrome Apps 即將退役, 所以 PostMan 這樣的 app 要獨立安裝程式, 但是又不想要這樣
  • 有時候針對 API 會有使用 curl 測試的需求, 想要在單一 程式就可以達成

所以就搜尋了在 vscode 裡面大家可能會用的 Extension
找到了 REST Client

REST Client 安裝

在 vscode 的 Extension 頁面搜尋 REST Client
點選 Install


安裝完畢之後, 只要是 .http 的檔案

然後有 3 個 # 表示可以點選發送請求

例如


上方會出現 Send Request
點選之後, 右邊會出現回應結果



另外一個覺得很方便的功能是 “ Copy Request As cURL”

在剛剛的 GET 上面按滑鼠右鍵


在終端機上面貼上, 會協助轉成 curl 的方式

> curl  --request  GET   --url  https://api.github.com/users/sakanamax

還有一個是 “ Generate Code Snippet”
可以把 Request 轉成其他程式
一樣在剛剛的 GET 上面按滑鼠右鍵
點選 Generate Code Snippet

點選要轉的語言
我這邊選 Python

要使用的方式


就會產生 python 檔案


真的是相當的方便
:)

另外一個好處就是可以在同一個檔案存多個 Request
然後圖片可以直接預覽


越來越覺得 vscode 真的是方便的好工具
~ enjoy it

Reference:

星期日, 1月 19, 2020

使用 SendGrid in Azure 發送信件小記

使用 SendGrid in Azure 發送信件小記

最近因為專案的關係, 可能會使用 smokeping 來嘗試監控網路狀況
因為想要設置告警的關係, 所以來測試在 Public Cloud 內發送信件通知 

公有雲因為政策的關係, 目前不允許讓公有雲內的 VM 直接使用 SMTP 發信, 但是可以使用公有雲內建的服務或是第三方的服務.


測試的第三方服務是 SendGrid
  • SendGrid 官方網站
  • 原因是 Azure , GCP, AWS 都有支援
  • 免費計劃每月可以發送 25,000 封 e-mail , 以通知信件來說應該很充足
  • 有 WebAPI 以及 SMTP Relay 兩種, 程式或是系統都可以使用


參考 Azure 官方文件

申請 SendGrid 帳號

首先登入 Azure Portal
建立資源 -- > 搜尋 SendGrid -- > 出現Marketplace 中 SendGrid -- > 點選 建立 


輸入相關資訊
Pricing Tier 預設就是 Free
點選 Review + Create

點選 Create 建立帳戶



這邊遇到一個 Bug 就是
  • 申請欄位的 Website 沒有紅色的 * , 但是如果你沒有填的話會建立失敗....
  • 解法, 填個值進去就可以了


建立完成之後, 來驗證 e-mail
有驗證 e-mail 以及沒有驗證 e-mail 發送信件的次數是不一樣的

到剛剛建立的 SendGrid 服務, 點選 Manage


這個時候會另外開一個分頁, 導向到 SendGrid 網站
進入之後就會要求驗證 e-mail
回到信箱收信, 點選 Confirm Email Address
完成 e-mail 驗證

這邊要注意的一點是
  • 因為是透過 Azure 來申請, 所以在 SendGrid 官網上面的使用者名稱是 xxxxxxx@auzre.com 不是我們填入的 e-mail 帳號

建立 API Key

接下來就是建立 API Key

到剛剛建立的 SendGrid 服務, 點選 Manage


導向到 SendGrid 網站

點選畫面左方的 Settings -- > API Keys


然後點選 Create API Key


輸入 Key 名稱 -- > API Key Permission: 我是選 Restricted Access, 然後 Mail Send 給 Full Access
點選 Create and View

這樣就產生 API Key
只會出現一次, 記得把他記錄下來

建立完成之後, 畫面上也會出現那把 Key 的 資訊


接下來就要進行寄信的測試了

點選畫面左邊的 Email API -- > Integration Guide


我選擇推薦的 Web API 方式


選取要使用的語言
這邊我選 cURL 方式


接下來就會進入引導如何使用 curl 傳送信件
可以在步驟 2 Create an API Key 的地方, 輸入 另外一把測試 Key 名稱
點選 Create Key

系統會自動將產出的 Key 內容帶入到 Step 3


將 Step 3 的變數內容在 終端機內執行
將 Step 4 的變數內容在 終端機內執行 ( 也可以把 to: 後面的郵件換成自己的郵件 )

勾選 “I’ve exectuted the code about
點選 Next: Verify Integration
點選 Verify integration


可以確認 SendGrid 有收到 Request, 也可以到 Email Activity 去觀察


當然也可以到自己的信箱去確認

  • 使用官方的方式建立 API Key, 可以觀察到, 他也是用 Restricted Access, 然後 Mail Send 給 Full Access, 但是 Scheduled Sends 是完全關閉, 這個可以視情境不同來適用

使用 curl 方式達成之後, 接下來使用 Python 的方式

做法一樣
建立一個 API Key
變數存成 sendgrid.env
將 sendgrid.env 列為 .gitignore 內的檔案
source  ./sendgrid.env



接下來
使用 pip 指令安裝 sendgrid
# pip3  install  sendgrid

建立 python 檔案測試, 我建立一個 sendmail_use_sendgrid.py
內容如下


檔案可以參考 Github 上面

curl 以及 python 的方式都測試完, 最後就是 SMTP Relay

 一樣回到 Integration Guide
選取 SMTP Relay

這邊就相對簡單


  • SendGrid 可以支援 port 25 / 587 ( smtp ) 以及 465 ( smtps )
  • 帳號 是 apikey , 密碼就是自己的 API KEY


這樣今天就完成三種從 SendGrid 發送郵件方式
  • curl
  • Python
  • SMTP

~ enjoy it


Reference: