aws cloudwatch 預設隻支援郵件告警,時效性比較低。本方案是使用 cloudwatch 如何內建第三方如微信、釘釘、等支援api操作的即時聊天軟體,以下以微信告警為例。
在這篇文章中,我将會介紹如何通過 amazon sns 和 aws lambda 來實作将 aws cloudwatch 告警資訊發送到微信。
aws-cloudwatch-wechat
本方案中 cloudwatch 接收 ec2 運作名額并進行監控。當 ec2 名額超出設定門檻值後,cloudwatch 觸發告警事件,并将事件消息通過 sns 發送到 lambda 函數。lambda函數執行使用者自定義的代碼,包括:解析告警消息并發送到企業微信、釘釘機器人、或者 prometheus 等平台。
架構中 aws 服務簡介:
amazon cloudwatch 可以用來收集 aws 包括 ec2 、 rds 、 eks 等各種服務運作日志也可以收集使用者應用程式日志,可以作為 aws 上日志資料集散地。同時在 cloudwatch 上可以設定基于名額的告警、基于時間和事件的規則,它可以與 amazon sns 和 lambda 等其他aws服務進行使用。
aws lambda 是無伺服器的函數計算服務。通過 aws lambda ,無需預置或管理伺服器即可運作代碼。借助 lambda ,您幾乎可以為任何類型的應用程式或後端服務運作代碼,而且完全無需管理。您可以将您的代碼設定為自動從其他 aws 服務如: cloudwatch 、 sns 等觸發,或者直接從任何 web 或移動應用程式調用。
amazon sns 是一項用于應用與應用之間以及應用與人之間通信的完全托管型消息收發服務。
注冊企業微信賬号
在企業微信中建立應用
建立完成後記錄應用 secret
企業微信告警流程
擷取 access_token ,參考微信官方說明文檔
示例代碼:
緩存和重新整理 access_token,然後調用具體的業務接口,示例代碼:
這裡我建立兩種訂閱,一種基于郵件(發送郵箱連結确認),一種基于lambda。
(1)基于郵件
郵箱連結确認:
(2)基于lambda
建立aws lambda 函數
配置 lambda 環境變量(可選)
建立 corpid 和 corpsecret 環境變量,根據從企業微信擷取的值填充(可選)
建立 lambda 協定的訂閱
本例中使用 python requests 庫發送 post 請求,目前有兩種辦法實作:
直接使用 vendored 中的 requests ,但該方法2021年1月30日以後将不能使用。故不做推薦。
獨立安裝 requests 庫,需要将包和 lambda 代碼一起上傳到 aws lambda 執行環境。以使用虛拟環境來安裝函數依賴為例。
具體步驟如下:
關于虛拟環境使用和基本操作,詳見:
底層虛拟環境 virtualenv
linux中多版本python與virtualenv的結合使用
virtualenvwrapper 操作虛拟環境
選擇要監控的 ec2 監控頁籤,建立警報。(下圖是中國區控制台界面, aws global 控制台界面略有不同)
選擇前面步驟建立的 sns 主題,并選擇合适的監控告警名額
測試告警接收
如上圖所示, cpu 使用率已經超過設定門檻值, cloudwatch 發出告警。
在 cloudwatch 日志組中檢視 lambda 日志
收到告警郵件
收到微信報警
企業微信、釘釘接收 amazon cloudwatch 告警
aws 使用lambda實作企業微信報警