超實用技巧無私公開|Lambda + Python + cURL + CloudWatch 快速建置網站全面性即時管控服務

Roman Tsai
BlendVision
Published in
10 min readSep 25, 2019

由於 AWS Lambda 是一個無伺服器運算服務,使用它不需要佈建或管理伺服器。只需為執行程式碼使用的運算時間支付費用,一旦沒有執行程式碼時,就會停止計費。特別值得一提的是,這個服務免費提供每月100萬次 Lambda requests,因此用它來建構監控網站服務便成為最經濟划算的選項之一。

下圖為整體系統架構設計,利用 Lambda + Python + cURL + CloudWatch ,就能在短短十分鐘左右,建立針對網站的 end to end 點對點即時管理及監控服務。

使用情境說明

cURL 是一個十分好用的工具,除了支援許多常用的通訊協定 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET 和TFTP)外,還支援更多的應用功能,如:proxy support, user authentication, FTP upload, HTTP post, SSL connections, file transfer…等等。

以下說明一些常用的使用情境:

情境一:檢測網站是否安在-Ping / Health check

這是最常見的情形,只需要簡單語法:
curl http://www.example.com/
or
curl -Is
https://www.google.com -L | grep HTTP/

curl 後面加上網址,若有收到網站回應內容,如:HTML, JSON或是XML格式資料時,表示該網址是正常在運作;grep HTTP 回傳 200 表示 OK,反之若顯示 Error 404 或是 503 等其它錯誤訊息時,表示該網址發生問題需進一步查證。

情境二:查驗身份認證機制是否正常 - User authentication

若網站要求要帳號/密碼認證,語法如下:
curl --user name:password http://www.example.com

情境三:測試發佈訊息是否正常 - Form POST

若是再加上傳送 Form Post data,語法如下:
curl -X POST --data “email=mymail@gmail.com&mobile=0900–000000” http://www.example.com/form.php

情境四:測試用 JSON 格式傳送是否正常 - Post JSON

若是以 JSON 格式訊息來傳送訊息,語法如下:
curl -X POST -H “Content-Type: application/json” -d ‘{“userid” :“guest”, “password” : “guestpassword”}’ http://www.example.com/api/login

情境五:測試是否可以檔案下載 - Output file

若是需直接儲存下載網址檔案,語法如下:
curl -O http://www.example.com/file.pdf

Multiple File Download 多檔下載:
curl -O http://www.example.com/file1.doc -O http://www.example.com/file2.doc

情境六:測試是否可以從 FTP 伺服器下載檔案 — Download file from FTP server

若是需從 FTP 伺服器下載檔案時,語法如下:
curl --user name:password -o ftp://ftp.example.com/ftp.file

情境七:測試是否可以從 FTP 伺服器上傳檔案 - Upload file to FTP server

若是需上傳檔案至FTP伺服器時,語法如下:
curl --user name:password -T myfile.pdf ftp://ftp.example.com/

情境八:測試是否可以上傳檔案至 AWS S3 bucket — Upload file to S3 bucket

設定可以存取 S3 bucket 的 AWS account 之 AccessKey 及 Secret Key 後,便能透過 cURL 方式把檔案上傳至指定的 S3 bucket 上。

date=`date +%Y%m%d`
dateFormatted=`date -R`
s3Bucket=”Your_S3_bucket
fileName=”Your_filename
relativePath=”/${s3Bucket}/${fileName}
contentType=”application/octet-stream” stringToSign=”PUT\n\n${contentType}\n${dateFormatted}\n${relativePath}
s3AccessKey=”ACCESS_KEY_OF_S3_bucket
s3SecretKey=”SECRET_KEY_OF_S3_bucket
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3SecretKey} -binary | base64`
curl -X PUT -T “${fileName}” \
-H “Host: ${s3Bucket}.s3.amazonaws.com” \
-H “Date: ${dateFormatted}” \
-H “Content-Type: ${contentType}” \
-H “Authorization: AWS ${s3AccessKey}:${signature}” \
http://${s3Bucket}.s3.amazonaws.com/${fileName}

情境九:檢測 Proxy 伺服器是否運作正常 — Proxy Support

情境十:透過 Webhook 傳送訊息至 slack

監控的結果除了可以透過 SNS 以 Email, SMS, HTTP 來告知外,還可以把訊息傳送給slack,其方法很簡單就是至 Slack Webhook 網站(https://my.slack.com/services/new/incoming-webhook/) 獲取要傳送至Slack channel (e.g. #P0_notification) 的 URL 位址。其語法如下:

curl -X POST --data-urlencode “payload={\”channel\”: \”#P0_notification\”, \”username\”: \”webhookbot\”, \”text\”: \”This is a test message to slack channel.\”, \”icon_emoji\”: \”:ghost:\”}” https://hooks.slack.com/services/T00000000/BNN000000/G000000000000000000

上述的情境涵蓋網站狀況檢查、身份認證、資料及檔案傳送/下載等常見網站行為,這些行為皆可以套用在 Lambda function 中,利用 CloudWatch Event Rules 定期執行以達成掌控整個網站的狀況。

範例說明

接下來就用監控 Web 網站狀況的實際案例進行說明:

步驟 1:建立 Lambda function

  • 進入 AWS Lambda 畫面後,選擇 Create function。
  • 接著填寫 Function name 及 Runtime 所指定的程式語言;
  • 跟著按下 Create function 鍵,繼續。
  • 然後在下方的 Function code,把程式改用 cURL 來執行讀取網頁的作業

簡單幾行 python 程式碼配合 cURL 的指令便完成程式撰寫;

  • 後續就是一些基本函數設定,最後按下 Save 鍵完成 Lambda 設定。

步驟2:CloudWatch Rules 規則設定

  • 在 CloudWatch Rules 上,按 Create rule 鍵來建立監控規則
  • 然後選 Schedule 去定義成每分鐘檢查一次,在 Targets 中指定剛建立的Lambda function,填完後按 Configure details 鍵接續下一步 (下圖範例為1分鐘檢查1次)。
  • 最後填入 Name 及 Description 說明欄位後,按下 Create rule 鍵完成規則建立。
  • 點選 WebMonitoring ,可查看規則設定內容。
  • 點選 Web_Monitoring 可查看 Lambda function 設定內容

步驟3:查看監控的結果

  • 稍待幾分鐘執行後,便可以在該 Lambda 設定畫面中點選 Monitoring,看到Web網站監控的狀況圖表
  • 再點選 View logs in CloudWatch,查看所有蒐集指標的檔案清單
  • 或點選 Log Streams 清單,查看所有蒐集指標的內容

結語

運用 AWS Lambda 來管控網站,不但能在短短 10 分鐘左右完成網站監控設置,還可以有效降低運行成本。此外,如果再透過 cURL 設定,模擬出使用者行為或針對網站定期上傳/下載檔案進行處理,即可達成 Web API call 的端點對端點 (end to end) 監控。不僅如此,也能將其整合至 AWS CloudWatch 中進行監視,這對網管人員來說是很便捷的技巧喔!

--

--