說明
Amazon CloudWatch是亞馬遜雲上的統一監控平台,實作對雲上所有資源的監控。Amazon CloudWatch Alarm可以基于Amazon CloudWatch Metrics裡面的名額,根據自定義的規則觸發警報。通過內建Amazon SNS和Amazon Lambda,可以實作郵件、短信、企業微信、釘釘、飛書等多種方式的通知。
但是,Amazon CloudWatch Alarm僅會在警報從【正常】狀态轉變為【告警】狀态時觸發一次警報。此後,即使警報仍然處于【告警】狀态,也不會有新的通知産生。
本文将介紹,如何基于無伺服器函數編排工具
Amazon Step Functions
,在警報被觸發後輪詢警報狀态,實作持續報警的效果,以強調警報的存在,確定您系統中的問題可以得到足夠的重視。
架構圖
本方案包含如下元件:
元件說明:
(1)根據自己的需要,建立Amazon CloudWatch Alarm。
(2)Amazon CloudWatch Alarm會通過Amazon EventBridge,觸發Amazon Step Functions工作流
(3)Amazon Step Functions工作流的具體内容見下文。工作流中會包含以下兩個函數:
HandleAlarm:自定義的警報處理函數,用來實作通知邏輯。
CheckAlarm:下文會建立警報狀态檢查函數,用來判斷是否繼續發出通知。
部署流程
我們需要建立三個Lambda函數,一個狀态機~
建立Lambda函數 Alarm_FeiShu
建立一個Lambda函數,命名為
Alarm_FeiShu
即報警函數,核心源碼lambda_function.py,需要注意的是python運作時使用更高版本的
Python3.9
,如下:
上傳zip代碼包:
建立Lambda函數 CheckAlarm
建立一個Lambda函數,命名為
CheckAlarm
,使用
Amazon SDK
檢測警報狀态。使用
Python 3.9
作為runtime建立此函數,核心源碼詳見lambda_function.py
此函數需要調用cloudwatch:DescribeAlarms API,是以需要為此函數所使用的IAM Role添加此權限。
# 角色命名
CheckAlarmRole
# 附權重限
CloudWatchReadOnlyAccess
此函數會自動從event參數中解析出警報的名稱。最終傳回值為OK/ALARM/INSUFFICIENT_DATA/ERROR中的一個。
建立Lambda函數 Alarm_FeiShu_Response
建立一個Lambda函數,命名為
Alarm_FeiShu_Response
即報警恢複函數,核心源碼lambda_function.py,需要注意的是python運作時使用更高版本的
Python3.9
。
建立Amazon Step Functions
使用如下内容建立Step Functions工作流即狀态機,詳見Functions_state_machine.json
需要把上述文檔中的如下内容進行替換:
- <AlarmHandler>: 響應警報的Lambda函數的ARN即Alarm_FeiShu和Alarm_FeiShu_Response。需要自行建立此函數,并在裡面實作通知/處理邏輯。
- <CheckAlarm>: 剛才建立的CheckAlarm函數的ARN。
預設建立Step Functions,那麼輪詢周期為5分鐘(300秒)。可以通過修改文檔中的下述内容來修改輪詢周期:
"Wait": {
"Type": "Wait",
"Seconds": 1800, // 修改這個值,機關為秒,這裡修改為30分鐘
"Next": "CheckAlarm"
},
上述文檔會建立如下狀态機:
當警報狀态改變,觸發此狀态機時,會順序執行下述操作:
(1)警報的狀态是否是ALARM。如果不是,則調用Alarm_FeiShu_Response函數,最後跳轉到Pass狀态并結束狀态機;
(2)調用Alarm_FeiShu函數,根據自定義的邏輯發出通知;
(3)進入Wait狀态,等待一段時間;
(4)調用CheckAlarm函數,判斷警報狀态:
- 如果函數傳回OK,即警報已經恢複正常,則進入Pass 狀态并結束狀态機
- 如果函數傳回ALARM,即警報仍然在告警,則回到步驟1
- 如果函數傳回其他值,視為故障并進入Fail狀态,結束狀态機
此狀态機的兩個Lambda函數都在
InputPath
中引用了$$.Execution.Input變量,使它們即使被多次觸發,或者在循環中被觸發,也會有一緻的輸入值。
建立報警
我們需要建立cloudwatch報警規則,對應建立Amazon EventBridge --> 個規則,個規則中指定我們上面建立的狀态機,以使它們之間可以關聯起來。
配置CloudWatch警報
根據需求,建立
CloudWatch
警報。此方案會使用
EventBridge
觸發
Step Functions
,是以它在建立的時候不需要配置任何通知。删除所有的通知,并直接點選Next。
建立完畢後,複制EventBridge規則:
配置EventBridge規則
建立EventBridge規則,目标為剛才建立的Step Functions狀态機,規則配置步驟:
建議:規則名字與報警名字保持一緻
說明:
示例事件-可選
可不用填寫
說明:
輸入事件JSON
即為上面提到的EventBridge規則
建議:執行角色使用建立新角色
至此,每當警報狀态發生改變的時候,狀态機就會被觸發。如果警報的狀态為【報警中】,狀态機就會發出持續通知。
報警資訊示例
報警恢複示例
補充狀态機運作狀态
當報警被觸發後不到Wait規定的循環檢查時間,該報警就恢複了,此時狀态機運作邏輯如下: