阿里雲ECS系統事件類比演練最佳實務

更新時間:
Copy as MD

本教程提供一個端到端的實踐指南,介紹如何通過APICLI建立ECS類比系統事件,以驗證和演練基於事件的警示鏈路、自愈指令碼和應急預案,確保自動化營運體系的可靠性。

業務情境

自動化營運體系通常依賴 ECS 系統事件(如計劃內重啟、系統故障)來觸發響應(如自動警示、從負載平衡摘除執行個體、觸發資料備份)。然而,真實的系統事件發生率低且不可預測,導致在生產環境上線前,難以對自動化響應流程進行充分的端到端測試。

ECS類比系統事件功能正是為解決此問題而設計。它允許主動為指定執行個體建立與真實事件結構完全一致的類比事件通知,而不會對執行個體執行任何實際的營運操作(如重啟或停止),從而實現對下遊自動化系統的安全、高效的演練。通過類比系統事件功能,您可以主動建立類比事件來驗證以下情境:

情境

驗證目標

警示鏈路測試

驗證CloudMonitor、事件匯流排、簡訊或DingTalk通知是否正常觸發。

應急預案演練

驗證營運團隊的響應時效和操作規範。

自動化指令碼驗證

驗證自愈指令碼(如自動重啟服務、切換流量)是否按預期執行。

重要

類比事件不等於實際操作:類比事件僅觸發事件通知(狀態變化和訊息推送),不會對執行個體執行重啟、停止或釋放等操作。事件記錄會完整留存在控制台和Action Trail中。

方案架構

本方案的核心是通過調用 CreateSimulatedSystemEvents API 向目標 ECS 執行個體注入類比事件,流程如下:

  1. 事件注入:通過 CLI/SDK 設定事件類型與計劃執行時間,為執行個體建立類比事件。

  2. 產生與分發:ECS 後端產生與真實事件結構相同的通知,並通過事件匯流排(EventBridge)或CloudMonitor進行標準分發。

  3. 自動化響應:下遊系統(如Function Compute FC、Webhook 或營運指令碼)監聽到事件後,觸發預設的商務邏輯。

  4. 驗證與閉環:查詢事件狀態確認流轉正常,演練結束後通過 API 取消事件,完成閉環。

實施步驟

類比系統事件功能當前僅支援通過API、CLISDK操作,ECS控制台暫未提供建立或取消事件的介面入口。
推薦使用阿里雲OpenAPI開發人員門戶進行線上調用與調試,您可以在OpenAPI Explorer中直接運行該介面,並且運行成功後,OpenAPI Explorer可以自動產生SDK程式碼範例。

本節將引導您通過阿里雲CLI完成一次的類比事件演練,包括環境準備、事件建立、狀態驗證和資源清理。

準備工作:配置許可權與工具

在開始之前,需要為操作帳號授予必要的API許可權,並確保已安裝和配置好阿里雲CLI。

  1. 配置最小化RAM許可權

    建議建立一個自訂的RAM策略,僅授予執行類比事件所需的建立、取消和查詢事件所必需的許可權。 登入RAM控制台,建立一個名為ECSSimulatedEventPolicy的自訂策略,並填入以下策略內容。隨後,將此策略授權給用於執行操作的RAM使用者。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecs:CreateSimulatedSystemEvents",
            "ecs:CancelSimulatedSystemEvents",
            "ecs:DescribeInstanceHistoryEvents"
          ],
          "Resource": "*"
        }
      ]
    }
  2. 安裝和配置阿里雲CLI

    1. 安裝CLI

    2. 配置憑證

步驟一:建立類比系統事件

可類比事件類型:並非所有系統事件都支援類比。支援的事件類型包括因系統維護或系統故障導致的執行個體重啟、停止、重新部署等。具體列表請參考CreateSimulatedSystemEventsEventType參數取值。

  1. 產生 UTC 格式的計劃執行時間。

    NotBefore參數必須使用UTC時間(ISO 8601格式)。使用本地時間將導致事件觸發時間不符合預期(例如,在中國時區會延遲8小時)。可使用以下跨平台命令產生未來10分鐘的UTC時間:

    Linux

    date -u -d '+10 minutes' +"%Y-%m-%dT%H:%M:%SZ"

    macOS

    date -u -v+10m +"%Y-%m-%dT%H:%M:%SZ"

    Windows

    (Get-Date).AddMinutes(10).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss'Z'")
  2. 執行以下命令建立類比事件。

    請確保目標執行個體在建立事件時處於運行中(Running)狀態。

    # 設定時間變數
    NOT_BEFORE=$(date -u -d '+10 minutes' +"%Y-%m-%dT%H:%M:%SZ")
    
    # 建立類比事件
    aliyun ecs CreateSimulatedSystemEvents \
      --RegionId cn-hangzhou \
      --InstanceId.1 i-bp1xxxxxxxxx \
      --EventType SystemMaintenance.Reboot \
      --NotBefore $NOT_BEFORE

    執行成功後,系統會返回類似如下的響應。請記錄EventId,後續的驗證和取消操作將需要使用它。

    {
      "EventIdSet": {
        "EventId": [
          "e-t4nxxxxxxxxx"
        ]
      },
      "RequestId": "A1B2C3D4-E5F6-7890-1234-ABCDEF123456"
    }

不同類型的類比系統事件生命週期存在差異:

  • 計劃內維護(SystemMaintenance)事件,建立後通常會經歷以下狀態流轉:

    • Scheduled(計劃中):類比事件建立後自動進入此狀態。

    • Executed(已完成):到達指定時間點(NotBefore)後,如無人為幹預,自動變為完成狀態。

    • Canceled(已取消):調用 CancelSimulatedSystemEvents 後進入此狀態。

    • Avoided(已避免):僅適用於 SystemMaintenance.Reboot 類型,在指定時間點前主動重啟執行個體可使事件變為已避免狀態。

  • 非預期故障(SystemFailure 或 InstanceFailure) 類的事件,因其類比的是突發故障,建立後可能會跳過 Scheduled 狀態,直接進入 Executing(執行中)或完成狀態。

步驟二:驗證事件通知與狀態

事件建立後,系統會通過多種渠道發布通知。本步驟旨在驗證這些通知是否被正確接收,以及如何查詢事件的目前狀態,這是確保自動化指令碼能夠被觸發的關鍵。

  1. 查詢事件狀態

    使用上一步記錄的EventId,通過DescribeInstanceHistoryEvents 介面查詢事件的詳細狀態。

    # 使用之前記錄的EventId
    aliyun ecs DescribeInstanceHistoryEvents \
      --RegionId cn-hangzhou \
      --EventId.1 e-t4nxxxxxxxxx \
      --output table

    預期輸出會顯示該事件的狀態為Scheduled(計劃中)。同時,也可以前往ECS控制台-事件查看事件記錄。

  2. 檢查下遊通知

    根據系統配置,前往相應的服務控制台檢查事件是否已成功投遞:

    • 事件匯流排 EventBridge:在對應的事件匯流排和規則下,檢查事件軌跡。

    • CloudMonitor:在事件監控 > 系統事件頁面,篩選執行個體ID,查看事件記錄。

    • Message Service MNS/DingTalk/郵件:檢查是否收到由CloudMonitorEventBridge觸發的警示通知。

  3. 解析事件訊息結構

    自動化系統整合的關鍵是正確解析事件通知。以下是通過事件匯流排EventBridge接收到的事件訊息體樣本。訊息中包含了事件ID、執行個體ID、事件類型和狀態等核心資訊。您可以據此編寫自動化解析指令碼:

    {
      "id": "d8134431-b269-4f17-9157-xxxxxxxxxxxx",
      "source": "acs.ecs",
      "specversion": "1.0",
      "type": "ecs:SystemEvent:Scheduled",
      "datacontenttype": "application/json;charset=utf-8",
      "subject": "acs:ecs:cn-hangzhou:123456789012****:instance/i-bp1xxxxxxxxx",
      "time": "2026-02-28T09:50:00Z",
      "aliyunpublishtime": "2026-02-28T09:50:00.123Z",
      "aliyuneventbusname": "default",
      "data": {
        "eventId": "e-t4nxxxxxxxxx",
        "instanceId": "i-bp1xxxxxxxxx",
        "eventType": "SystemMaintenance.Reboot",
        "eventStatus": "Scheduled",
        "notBefore": "2026-03-01T10:00:00Z",
        "publishTime": "2026-02-28T09:50:00Z",
        "regionId": "cn-hangzhou",
        "eventCategory": "SystemMaintenance"
      }
    }

步驟三:取消事件

演練完成後,請務必取消所有未執行的類比事件,以避免對監控系統造成持續幹擾或在未來引發誤判。

使用CancelSimulatedSystemEvents API和之前記錄的EventId來取消事件。

aliyun ecs CancelSimulatedSystemEvents \
  --RegionId cn-hangzhou \
  --EventId.1 e-t4nxxxxxxxxx

成功的響應會返回操作的RequestId,表示事件已成功取消。此時重新查詢該事件,其狀態將變為Canceled

進階實踐:演練自動化響應

本節提供一個完整的演練指令碼模板,類比一個端到端的自動化營運情境:從建立事件,到驗證狀態,再到執行類比的自愈操作,最後取消事件並清理資源。

#!/bin/bash
# ECS類比事件端到端演練指令碼
set -e # 任何命令失敗則立即退出

# --- 配置參數 ---
INSTANCE_ID="${1:-i-bp1xxxxxxxxx}" # 從第一個參數擷取執行個體ID,或使用預設值
REGION="cn-hangzhou"
EVENT_TYPE="SystemMaintenance.Reboot"

echo "=== ECS類比事件演練開始 ==="
echo "目標執行個體ID: $INSTANCE_ID"
echo "事件類型: $EVENT_TYPE"
echo "地區: $REGION"

# 1. 建立類比事件,計劃在10分鐘後執行
NOT_BEFORE=$(date -u -d '+10 minutes' +"%Y-%m-%dT%H:%M:%SZ")
echo "計劃執行時間 (UTC): $NOT_BEFORE"

EVENT_ID=$(aliyun ecs CreateSimulatedSystemEvents \
  --RegionId $REGION \
  --InstanceId.1 $INSTANCE_ID \
  --EventType $EVENT_TYPE \
  --NotBefore "$NOT_BEFORE" \
  --output json | jq -r '.EventIdSet.EventId[0]')

if [ -z "$EVENT_ID" ]; then
  echo "錯誤:建立事件失敗!"
  exit 1
fi
echo "✓ 事件已建立,ID: $EVENT_ID"

# 2. 延遲5秒後驗證事件狀態
echo "=== 等待5秒後驗證事件狀態... ==="
sleep 5
aliyun ecs DescribeInstanceHistoryEvents \
  --RegionId $REGION \
  --EventId.1 $EVENT_ID \
  --output table

echo "✓ 狀態驗證完成,請檢查輸出結果是否為 'Scheduled'。"

# 3. 類比自愈指令碼觸發
echo "=== 類比自動化系統響應 ==="
echo "檢測到系統維護事件,執行預定義響應..."
echo "  - [類比] 發送警示通知到DingTalk群"
echo "  - [類比] 為執行個體添加 'maintenance_in_progress' 標籤"
echo "  - [類比] 調用SLB API將執行個體權重設為0"
echo "✓ 類比響應執行完畢。"

# 4. 清理演練資源
echo "=== 清理演練資源 ==="
aliyun ecs CancelSimulatedSystemEvents \
  --RegionId $REGION \
  --EventId.1 $EVENT_ID

echo "✓ 事件已取消。"
echo "=== 演練完成 ==="

成本與風險說明

成本

類比系統事件功能本身不收取任何費用。但演練過程中可能涉及的其他雲產品(如事件匯流排EventBridge、Function ComputeFC、Message ServiceMNS)會按其標準定價收費。

風險與限制

  • Action Trail:所有建立和取消類比事件的操作均會被Action Trail(ActionTrail)完整記錄,確保所有演練行為可追溯、可審計。

  • 功能限制:類比事件僅觸發事件通知,不會對執行個體執行任何實際的物理操作(如重啟、停止)。每個執行個體在同一時間只能存在一個類比事件。

  • API限流:相關API調用受配額限制。高頻次的演練請求可能會觸發API限流,具體限制請參見流控資訊