本文介紹如何通過EventBridge主動訂閱ECS事件,將其投遞至指定下游服務。
背景信息
事件總線(EventBridge)作為阿里云上的事件中樞,提供統一的事件中心,以標準化的CloudEvents 1.0協議連接云產品和應用、應用和應用,幫助云產品、SaaS產品以及您管理業務領域內產生的事件。EventBridge致力于保障上游云產品事件的質量,同時提供更好的事件訂閱體驗,提高數據訂閱投遞的可靠性,SLA數據可靠性99.99999999%,服務可用性99.95%。
相比調用ECS的API接口DescribeInstanceHistoryEvents
以定時輪詢方式查詢ECS服務是否有新的事件產生,EventBridge通過主動訂閱的方式,有以下幾個優點:
時效性更高:一旦訂閱監聽到指定的ECS事件產生,能夠在毫秒級觸發指定操作。
成本更低:不需要定時輪詢檢查事件是否產生,避免不必要的開銷。
適用場景
訂閱指定的ECS事件,觸發釘釘、短信、郵箱通知等。
將指定的ECS事件,通過公網或者VPC網絡推送到下游HTTP/HTTPS服務。
匯總多個云賬號下的ECS事件。
指定的ECS事件發生時,通過函數計算觸發特定動作。
當ECS事件時延較高、事件量較大時,將其投遞至輕量消息隊列(原 MNS)來訂閱事件。
前提條件
創建釘釘機器人,記錄Webhook地址和密鑰。更多信息,請參見釘釘官方文檔。
創建輕量消息隊列(原 MNS)隊列,更多信息,請參見開通輕量消息隊列(原 MNS)并授權和創建隊列。
步驟一:選用云服務專用事件總線
云服務專用事件總線即default總線,是EventBridge默認創建的總線,阿里云上各個云產品會實時將產品內產生的事件,通過多種渠道實時投遞到default總線,您可以在default總線上查找和訂閱各個云產品的事件。
- 登錄事件總線EventBridge控制臺,在左側導航欄,單擊事件總線。
- 在頂部菜單欄,選擇地域。
在事件總線頁面,單擊default。
步驟二:創建ECS事件訂閱規則
在事件總線頁面,單擊左側導航欄的事件規則,然后單擊創建規則。
在創建規則面板,完成以下操作。
在配置基本信息頁簽,在名稱文本框輸入規則名稱,在描述文本框輸入規則的描述,然后單擊下一步。
在配置事件模式頁簽,完成以下配置,然后單擊下一步。
單擊阿里云官方事件源頁簽。
在事件源下拉列表選擇acs.ecs。
在事件類型下拉列表選擇需要訂閱的事件類型。可同時選擇訂閱多個事件類型。
在事件模式調試中,可查看訂閱的事件類型的示例。例如,事件類型選擇ecs.Instance.StateChange 實例生命周期狀態變化時,對應的示例如下。
{ "id": "45ef4dewdwe1-7c35-447a-bd93-fab****", "source": "acs.ecs", "specversion": "1.0", "subject": "acs.ecs:cn-hangzhou:123456789098****:215672", "time": "2020-11-19T21:04:41Z", "type": "ecs:Instance:StateChange", "aliyunaccountid": "123456789098****", "aliyunpublishtime": "2020-11-19T21:04:42Z", "aliyuneventbusname": "default", "aliyunregionid": "cn-hangzhou", "aliyunpublishaddr": "172.25.XX.XX", "data": { "instanceName": "iZ0jl0kyquo46h****", "instanceType": "ecs.c6.large", "privateIpAddress": "172.21.XX.XX", "publicIpAddress": "8.37.XX.XX", "resourceId": "i-0jl0kyquo46****", "resourceType": "ALIYUN::ECS::Instance", "spotStrategy": "SpotWithPriceLimit", "state": "Running" } }
在配置事件目標頁簽,選擇不同的服務類型,設置推送場景。
場景一:推送至輕量消息隊列(原 MNS)
使用輕量消息隊列(原 MNS)來訂閱事件適用于對事件時延要求較高、事件量較大的場景。輕量消息隊列(原 MNS)費用詳情請參見計費說明。
服務類型:選擇輕量消息隊列(原 MNS)。
隊列:選擇已創建的隊列。
消息體(body):選擇完整事件。
開啟 Base64 解碼:選擇是。開啟Base64 編碼,會幫助您將數據編碼后投遞至目標輕量消息隊列(原 MNS)中的隊列。
服務類型為輕量消息隊列(原 MNS)時,可通過NetworkInterfaceDemo.zip監聽輕量消息隊列(原 MNS)消息獲取事件。
場景二:推送至釘釘
服務類型:選擇釘釘。
地址:輸入釘釘機器人的Webhook地址。
密鑰:輸入釘釘機器人密鑰。
推送內容:您可以通過EventBridge的模板能力,將上面事件中的參數推送給釘釘機器人,例如,推送ECS實例的名稱(instanceName)和運行狀態(state),配置如下:
變量:通過JsonPath指定需要獲取的事件中的字段信息,并設置變量名稱。
{ "instanceName":"$.data.instanceName", "state":"$.data.state" }
模板:按照釘釘機器人需要的格式定義模板,并在模板中引入上面定義的變量。
{ "msgtype": "text", "text": { "content": "${instanceName} state is ${state}" } }
更多配置請參見釘釘機器人參考文檔。
場景三:推送至下游HTTP服務
服務類型:選擇HTTP或者HTTPS。
URL:配置接收事件的URL地址。
Body:配置接收事件的內容格式。EventBridge支持將事件轉換后,按需要的格式推送給HTTP目標端,目前支持四種轉換格式:完整事件、部分事件、固定值、模板。更多信息,請參見事件內容轉換。
網絡類型:
公網:通過公網訪問目標URL地址。
專有網絡:如果目標URL的地址未暴露公網,可以選擇專有網絡,需設置VPC ID、VSwitch ID和安全組ID。
場景四:推送后觸發動作
如果希望在ECS事件發生時,觸發某個更加個性化的動作,可以將服務類型設置為函數計算。把事件推送到指定的函數,在函數計算里通過代碼編輯個性化的操作。
場景五:匯總多個云賬號下的ECS事件
EventBridge支持將不同賬號、不同地域下的ECS事件匯總到同一個地域的同一個賬號下的事件總線,需要選擇服務類型為EventBridge事件總線。
目標類型:
同賬號總線:投遞給當前賬號的其他總線。
跨賬號總線:投遞給其他賬號的總線。如需選擇跨賬號投遞,需要進行賬號授權,詳細信息,請參見路由到事件總線EventBridge。
地域:支持中國內地跨地域投遞和國外地域之間相互投遞。
事件總線:要投遞的目標總線名稱。
事件:默認投遞完整事件且不可更改。
在配置事件目標頁簽下方,您可以根據業務需要配置重試和死信策略。詳情請參見重試和死信。
更多場景,請參見目標服務類型。
步驟三:觸發事件
本文以ecs.Instance.StateChange 實例生命周期狀態變化
事件類型為例,觸發事件需要修改ECS實例的運行狀態。
登錄ECS管理控制臺。
在左側導航欄,選擇 。
在頂部菜單欄,選擇目標資源所在的地域。
在目標ECS實例右側操作列,選擇
,修改實例的運行狀態。
步驟四:查看投遞結果
查詢ECS是否產生事件。
EventBridge支持根據時間范圍、事件類型、訂閱規則名稱、事件ID(與ECS事件ID一致)來查詢搜索產生的ECS事件。操作步驟,請參見查詢事件。
查詢ECS事件的訂閱投遞結果。
通過上一步查詢到的事件ID,可以單擊事件ID右側操作列的事件軌跡查看事件推送軌跡,軌跡包含推送的目標、狀態、次數、時間。
事件的監控報警
您可以在的EventBridge監控大盤中看到創建的ECS事件訂閱任務的調用次數,推送成功率、推送延遲等。根據具體業務場景訴求配置報警策略。
登錄云監控控制臺。
在左側導航欄,選擇
。在云產品監控頁面的左側導航欄單擊中間件,然后將鼠標移至中間件區域的事件總線并單擊事件總線 - EventBus。
在事件總線 - EventBus頁面上方選擇地域,然后單擊default總線操作列的監控圖表,即可查看default總線的監控詳情。
您可以在監控頁面為EventBridge的資源設置報警規則。當資源符合報警規則時,云監控自動發送報警通知。操作步驟,請參見設置報警規則。
重試和死信
事件寫入EventBus之后,EventBridge保障事件能被推送到下游至少一次。當下游事件接收端出現異常(如宕機、服務不可用、網絡抖動等),導致接收端無法正常接收事件時,EventBridge支持多種方式處理這些異常,包括:重試策略、容錯策略、死信隊列。您可以在步驟二:創建ECS事件訂閱規則中,配置重試和死信策略,保障事件會被正確投遞。
重試策略
當下游接收端無法正常接收事件時,EventBridge推送給下游會發生異常,這種情況,您可以配置EventBridge重試推送下游接收端的策略,最大程度保證推送成功。
退避重試(重試3次,每次重試的時間間隔是10秒到20秒之間的隨機值。)
指數衰減重試(重試176次,每次重試的間隔時間指數遞增至512秒,總計重試時間為1天。每次重試的具體間隔為:1,2,4,8,...512秒。)
死信處理策略
當達到預設的重試策略的重試次數上限之后,如果事件依舊未成功投遞,EventBridge默認會丟棄該事件。如果您希望保留該事件,可以配置將這些事件發送到死信隊列。目前EventBridge支持的死信隊列包括:云消息隊列 RocketMQ 版、輕量消息隊列(原 MNS)、云消息隊列 Kafka 版、事件總線。
容錯策略
如果您有事件順序場景的訴求,當發生異常時,需要暫停任務,直到該事件成功推送,否則會出現事件亂序,此時需要選擇禁止容錯。如果是非順序場景,建議優先選擇允許容錯,以提供最大并發推送能力。
允許容錯(允許異常容錯,當異常發生時不會阻塞執行,超過重試策略后會根據配置將消息投遞至死信隊列或直接丟棄。)
禁止容錯(不允許容錯,當異常發生并超過重試策略配置時會阻塞執行)。