天天看點

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

說明

Amazon CloudWatch是亞馬遜雲上的統一監控平台,實作對雲上所有資源的監控。Amazon CloudWatch Alarm可以基于Amazon CloudWatch Metrics裡面的名額,根據自定義的規則觸發警報。通過內建Amazon SNS和Amazon Lambda,可以實作郵件、短信、企業微信、釘釘、飛書等多種方式的通知。

但是,Amazon CloudWatch Alarm僅會在警報從【正常】狀态轉變為【告警】狀态時觸發一次警報。此後,即使警報仍然處于【告警】狀态,也不會有新的通知産生。

本文将介紹,如何基于無伺服器函數編排工具

Amazon Step Functions

,在警報被觸發後輪詢警報狀态,實作持續報警的效果,以強調警報的存在,確定您系統中的問題可以得到足夠的重視。

架構圖

本方案包含如下元件:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

元件說明:

(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

,如下:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

上傳zip代碼包:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

建立Lambda函數 CheckAlarm

建立一個Lambda函數,命名為

CheckAlarm

,使用

Amazon SDK

檢測警報狀态。使用

Python 3.9

作為runtime建立此函數,核心源碼詳見lambda_function.py

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

此函數需要調用cloudwatch:DescribeAlarms API,是以需要為此函數所使用的IAM Role添加此權限。

# 角色命名
CheckAlarmRole
# 附權重限
CloudWatchReadOnlyAccess
           
Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态
Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

此函數會自動從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

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

需要把上述文檔中的如下内容進行替換:

  • <AlarmHandler>: 響應警報的Lambda函數的ARN即Alarm_FeiShu和Alarm_FeiShu_Response。需要自行建立此函數,并在裡面實作通知/處理邏輯。
  • <CheckAlarm>: 剛才建立的CheckAlarm函數的ARN。

預設建立Step Functions,那麼輪詢周期為5分鐘(300秒)。可以通過修改文檔中的下述内容來修改輪詢周期:

"Wait": {
      "Type": "Wait",
      "Seconds": 1800, // 修改這個值,機關為秒,這裡修改為30分鐘
      "Next": "CheckAlarm"
},
           

上述文檔會建立如下狀态機:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

當警報狀态改變,觸發此狀态機時,會順序執行下述操作:

(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。

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

建立完畢後,複制EventBridge規則:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

配置EventBridge規則

建立EventBridge規則,目标為剛才建立的Step Functions狀态機,規則配置步驟:

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

建議:規則名字與報警名字保持一緻

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

說明:

示例事件-可選

可不用填寫

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

說明:

輸入事件JSON

即為上面提到的EventBridge規則

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

建議:執行角色使用建立新角色

至此,每當警報狀态發生改變的時候,狀态機就會被觸發。如果警報的狀态為【報警中】,狀态機就會發出持續通知。

報警資訊示例

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

報警恢複示例

Amazon CloudWatch持續報警說明架構圖部署流程建立報警補充狀态機運作狀态

補充狀态機運作狀态

當報警被觸發後不到Wait規定的循環檢查時間,該報警就恢複了,此時狀态機運作邏輯如下: