閱讀英文

共用方式為


設定自訂警示以監視已公告路由

本文可協助您使用 Azure 自動化和 Logic Apps,持續監視從 ExpressRoute 網路閘道公告至內部部署網路的路由數目。 監視有助於防止達到 1000 個路由限制

Azure 自動化可讓您自動執行 Runbook 中所儲存的自訂 PowerShell 指令碼。 本文說明搭配 PowerShell 指令碼使用 Runbook 的組態。 指令碼會查詢一或多個 ExpressRoute 閘道並收集資料集。 資料集包含資源群組、ExpressRoute 閘道名稱,以及從內部部署網路環境公告的網路首碼數目。

Azure Logic Apps 會排程自訂工作流程,以呼叫 Azure 自動化 Runbook。 Runbook 會透過作業來執行。 在執行資料收集後,Azure Logic Apps 工作流程會將資料分類,然後根據網路首碼數目的比對準則是大於還是小於預先定義的閾值,然後將資訊傳送至目的地電子郵件地址。

工作流程

用來設定自訂警示的基礎是三大步驟:

  1. 使用「執行身分」帳戶和權限來建立自動化帳戶。

  2. 建立並設定 Runbook。

  3. 建立邏輯應用程式,以在數目大於閾值 (例如 160) 時引發自動化帳戶並傳送警示電子郵件。

開始之前

在開始設定之前,請確認您已符合下列條件:

  • 部署中有至少一個 ExpressRoute 網路閘道。

  • 熟悉 Azure Logic Apps

  • 熟悉如何使用 Azure PowerShell。 需要使用 Azure PowerShell 才能在 ExpressRoute 網路閘道中收集網路首碼。 如需關於 Azure PowerShell 的一般詳細資訊,請參閱 Azure PowerShell 文件

附註和限制

  • 本文中討論的自訂警示屬於附加元件,可用來提升作業效率和控制能力。 其目的不是要取代 ExpressRoute 的原生警示。
  • ExpressRoute 網路閘道的資料收集作業會在背景執行。 執行時間可能會比預期的時間還久。 為了避免產生作業佇列,您必須正確設定工作流程週期。
  • 透過指令碼或 ARM 範本來進行部署時,作業速度可能會比自訂警示觸發程序還快。 這可能會導致 ExpressRoute 網路閘道中的網路首碼數目增加到超過 1000 個路由的限制。

建立及設定帳戶

當您在 Azure 入口網站中建立自動化帳戶時,即會自動建立執行身分帳戶。 此帳戶會採取下列動作:

  • 建立具有自我簽署憑證的 Microsoft Entra 應用程式。 執行身分帳戶本身會擁有依預設必須每年更新的憑證。

  • 在 Microsoft Entra ID 中為應用程式建立服務主體帳戶。

  • 在使用中的 Azure 訂用帳戶上,為該執行身分帳戶本身指派「參與者」角色 (Azure 角色型存取控制)。 此角色會使用 Runbook 來管理 Azure Resource Manager 資源。

若要建立自動化帳戶,您需要一些權限。 如需相關資訊,請參閱要建立自動化帳戶所需的權限

1.建立自動化帳戶

建立具有執行身分權限的自動化帳戶。 如需相關指示,請參閱建立 Azure 自動化帳戶

2.為執行身分帳戶指派角色

依預設,系統會將參與者角色指派給執行身分帳戶所使用的服務主體。 您可以保留指派給服務主體的預設角色,也可以藉由指派內建角色 (例如,讀者) 或自訂角色來限制權限。

請使用下列步驟來判斷執行身分帳戶所用服務主體獲派的角色:

  1. 瀏覽至您的自動化帳戶。 瀏覽至 [帳戶設定],然後選取 [執行身分帳戶]

  2. 選取 [角色] 以檢視將會使用的角色定義。

    指派角色

建立並設定 Runbook

1.安裝模組

若要在 Azure 自動化 Runbook 中執行 PowerShell Cmdlet,您必須額外安裝幾個 Az PowerShell 模組。 請使用下列步驟來安裝這些模組:

  1. 開啟 Azure 自動化帳戶,然後瀏覽至 [模組]

    流覽至模組

  2. 搜尋資源庫,並匯入下列模組:Az.AccountsAz.NetworkAz.AutomationAz.Profile

    搜尋和匯入模組

2.建立 Runbook

  1. 若要建立 PowerShell Runbook,請瀏覽至您的自動化帳戶。 在 [程序自動化] 底下,選取 [Runbook] 圖格,然後選取 [建立 Runbook]

  2. 選取 [建立] 來建立 Runbook。

  3. 選取新建立的 Runbook,然後選取 [編輯]

    編輯 Runbook

  4. 在 [編輯] 中,貼上 PowerShell 指令碼。 指令碼範例可進行修改,並用來監視一或多個資源群組中的 ExpressRoute 網路閘道。

    在指令碼範例中,請注意下列設定:

    • 陣列 $rgList 包含具有 ExpressRoute 網路閘道的資源群組清單。 您可以自訂以清單為基礎的 ExpressRoute 網路閘道。
    • 變數 $thresholdNumRoutes 會定義從 ExpressRoute 網路閘道公告到內部部署網路的網路首碼數目閾值。

範例指令碼

PowerShell
  ################# Input parameters #################
# Resource Group Name where the ExR GWs resides in
$rgList= @('ASH-Cust10-02','ASH-Cust30')  
$thresholdNumRoutes = 160
###################################################

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process | Out-Null

Try {

   $conn = Get-AutomationConnection -Name 'AzureRunAsConnection'
   while(!($connectionResult) -And ($logonAttempt -le 5))
   {
        $LogonAttempt++
        # Logging in to Azure...
        $connectionResult =  Connect-AzAccount `
                               -ServicePrincipal `
                               -ApplicationId $conn.ApplicationId `
                               -Tenant $conn.TenantId `
                               -CertificateThumbprint $conn.CertificateThumbprint `
                               -Subscription $conn.SubscriptionId `
                               -Environment AzureCloud 
                               
        Start-Sleep -Seconds 10
    }
} Catch {
    if (!$conn)
    {
        $ErrorMessage = "Service principal not found."
        throw $ErrorMessage
    } 
    else
    {
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

# Get the name of the Azure subscription
$subscriptionName=(Get-AzSubscription -SubscriptionId $conn.SubscriptionId).Name

#write-Output "<br>$(Get-Date) - selection of the Azure subscription: $subscriptionName" 
Select-AzSubscription -SubscriptionId $conn.SubscriptionId | Out-Null


$GtwList = @()
$results= @()

foreach ($rgName in $rgList)
{
## Collect all the ExpressRoute gateways in a Resource Group
$GtwList=Get-AzVirtualNetworkGateway -ResourceGroupName $rgName 

## For each ExpressRoute gateway, get the IP addresses of the BGP peers and collect the number of routes advertised 
foreach ($gw in $GtwList) {
  
  $peers = Get-AzVirtualNetworkGatewayBGPPeerStatus -VirtualNetworkGatewayName $gw.Name -ResourceGroupName $rgName


 if ($peers[0].State -eq 'Connected') {
   $routes1=$null
   $routes1 = Get-AzVirtualNetworkGatewayAdvertisedRoute -VirtualNetworkGatewayName $gw.Name -ResourceGroupName $rgName -Peer $peers[0].Neighbor
 }
  if ($peers[1].State -eq 'Connected') {
  
   $routes2=$null
   $routes2 = Get-AzVirtualNetworkGatewayAdvertisedRoute -VirtualNetworkGatewayName $gw.Name -ResourceGroupName $rgName -Peer $peers[1].Neighbor
 }
 
  $sampleTime=(Get-Date).ToString("dd-MM-yyyy HH:mm:ss")
  if ($routes1.Count -eq $routes2.Count)
  {
     
     if ($routes1.Count -lt $thresholdNumRoutes){
       $status='OK'
       $alertMsg='number of routes below threshold'
     } 
     else {
       $status='ALERT'
       $alertMsg='number of routes above threshold'
     }
  } 
  else
  {
     $status='WARNING'
     $alertMsg='check ER Gateway'
  }
  
  $obj = [psCustomObject]@{
            resourceGroup =$rgName
            nameGtw  = $gw.Name
            peer1 = $peers[0].Neighbor
            peer2 = $peers[1].Neighbor
            numRoutesPeer1=  $routes1.Count
            numRoutesPeer2=  $routes2.Count
            time=$sampleTime
            status=$status
            alertMessage = $alertMsg
        }
  $results += $obj
} ### end foreach gateways in each resource group
} ### end foreach resource group
$jsonResults= ConvertTo-Json $results -Depth 100
Write-Output  $jsonResults
 

3.儲存和發佈 Runbook

  1. 選取 [儲存] 可儲存 Runbook 草稿副本。
  2. 選取 [發佈] 可將 Runbook 發佈為自動化帳戶中的正式版 Runbook。

在執行 PowerShell 指令碼時會收集值清單:

  • 資源群組

  • ExpressRoute 網路閘道名稱

  • 第一個 BGP 對等體 (peer1) 的 IP 位址

  • 第二個 BGP 對等體 (peer2) 的 IP 位址

  • 從 ExpressRoute 網路閘道公告至第一個 BGP 對等體 (peer1) 的網路首碼數目

  • 從 ExpressRoute 網路閘道公告至第二個 BGP 對等體 (peer2) 的網路首碼數目

  • 時間戳記

  • 狀態,會分類為:

    • 「確定」,如果路由數目低於閾值
    • 「警示」,如果路由數目高於閾值
    • 「警告」,如果公告至兩個 BGP 對等體的網路首碼數目不同
  • 警示訊息,以詳細描述狀態 (確定、警示、警告)

PowerShell 指令碼會將收集到的資訊轉換成 JSON 輸出。 Runbook 會使用 PowerShell Cmdlet Write-Output 作為輸出資料流,以向用戶端傳達資訊。

4.驗證 Runbook

Runbook 建立好之後就必須進行驗證。 請選取 [啟動],並檢查不同作業資料流的輸出和錯誤。

建立並設定邏輯應用程式

Azure Logic Apps 是所有集合程序和動作程序的協調器。 在下列各節中,您會使用邏輯應用程式來建置工作流程。

工作流程

您會針對此邏輯應用程式建置工作流程以定期監視 ExpressRoute 網路閘道。 如果存在新的項目,工作流程便會針對每個項目傳送電子郵件。 當您完成時,工作流程大概會類似這個範例:

Logic Apps 工作流程

1.建立邏輯應用程式資源

在 Azure 入口網站中,建立取用邏輯應用程式資源,然後選取 [空白邏輯應用程式] 範本。 如需詳細資訊,請參閱建立範例使用量邏輯應用程式工作流程

空白範本

2.新增觸發程序

每個工作流程都會以觸發程序來開始。 觸發程序會在發生特定事件或符合特定條件時引發。 每次觸發程序引發時,Azure Logic Apps 都會建立並執行新的工作流程執行個體。

若要根據預先定義的時間排程來定期執行工作流程,請在工作流程中新增內建的週期觸發程序。 在搜尋方塊中輸入排程。 選取 [排程] 圖示。 從 [觸發程序] 清單中選取 [週期]

在 [週期] 觸發程序中,您可以設定要用於重複該工作流程的時區和週期。 時間間隔和頻率可一起為工作流程的觸發程序定義排程。 若要建立合理的最小週期頻率,請考慮下列因素:

  • 自動化 Runbook 中的 PowerShell 指令碼需要一些時間才能完成。 執行時間取決於要監視的 ExpressRoute 網路閘道數目。 週期頻率太短會導致作業佇列產生。

  • PowerShell 指令碼會以作業的形式在背景中執行。 其不會立即啟動;而是會延遲一下 (時間長短不一定) 再執行。

  • 週期頻率太短會在 Azure ExpressRoute 閘道上產生不必要的負載。

在工作流程設定結束時,您可以藉由執行工作流程幾次,然後在 [執行歷程記錄] 中確認結果,來檢查週期頻率是否一致。

3.建立作業

邏輯應用程式工作流程會透過連接器來存取其他應用程式、服務和平台。 下一步是選取連接器以存取稍早定義的 Azure 自動化帳戶。

  1. 在 [Logic Apps 設計工具] 的 [週期] 下方,選取 [新增步驟]。 在 [選擇動作] 和搜尋方塊中,選取 [全部]

  2. 在搜尋方塊中輸入 Azure 自動化,並進行搜尋。 選取 [建立作業]。 [建立作業] 會用來引發稍早建立的自動化 Runbook。

  3. 使用服務主體來登入。 您可以使用現有的服務主體,也可以建立新的服務主體。 若要建立新的服務主體,請參閱如何使用入口網站來建立可存取資源的 Microsoft Entra 服務主體。 選取 [使用服務主體來連線]

  4. 輸入 [連線名稱],新增 [用戶端識別碼] (應用程式識別碼)、[用戶端密碼] 和 [租用戶識別碼]。 然後,選取 [建立]

  5. 在 [建立作業] 頁面上,服務主體應該要在裝載自動化帳戶的 [資源群組] 上具有「讀者」角色,並在 [自動化帳戶] 上具有「自動化作業操作員」。 此外,也請確認您將 Runbook 名稱新增為新的參數。

4.取得作業輸出

  1. 選取新步驟。 搜尋 Azure 自動化。 從 [動作] 清單中選取 [取得作業輸出]

  2. 在 [取得作業輸出] 頁面上,指定用來存取自動化帳戶的所需資訊。 選取您要使用的 [訂用帳戶]、[資源群組] 和 [自動化帳戶]。 在 [作業識別碼] 方塊內部選取。 當 [動態內容] 清單出現時,選取 [作業識別碼]

5.剖析 JSON

[Azure 自動化建立作業動作] (先前的步驟) 的輸出中所包含的資訊會產生 JSON 物件。 內建的剖析 JSON 動作會透過屬性及其在 JSON 內容中的值建立方便使用的權杖。 然後,您就可以在工作流程中使用這些屬性。

  1. 新增動作。 在 [取得作業輸出] -> [動作] 底下,選取 [新增步驟]

  2. 在 [選擇動作] 搜尋方塊中輸入「剖析 json」,以搜尋會提供此動作的連接器。 在 [動作] 清單底下,針對您要使用的資料作業選取 [剖析 JSON] 動作。

  3. 在 [內容] 方塊內部選取。 當 [動態內容] 清單出現時,選取 [內容]

  4. 要有結構描述才能剖析 JSON。 您可以使用自動化 Runbook 的輸出來產生結構描述。 開啟新的網頁瀏覽器工作階段、執行自動化 Runbook,然後擷取輸出。 返回 [Logic Apps 剖析 JSON 資料作業] 動作。 在頁面底部,選取 [使用範例承載來產生結構描述]

  5. 針對 [輸入或貼上範例 JSON 承載],貼上自動化 Runbook 的輸出,然後選取 [完成]

    貼上範例承載

  6. 剖析 JSON 輸入承載即可自動產生結構描述。

6.定義變數並將其初始化

在工作流程的這個步驟中,我們會建立條件以透過電子郵件傳送警示。 為了讓您彈性地自訂電子郵件內文訊息的格式,我們在工作流程中引進了輔助變數。

  1. 在 [取得作業輸出動作] 底下,選取 [新增步驟]。 在搜尋方塊中尋找 [變數],並加以選取。

  2. 從 [動作] 清單中,選取 [將變數初始化] 動作。

    將變數初始化

  3. 指定變數的名稱。 在類型選取字串。 稍後會在工作流程中指派變數的 [值]

7.建立「For each」動作

剖析 JSON 之後,[剖析 JSON 資料作業] 動作會將內容儲存在 [主體] 輸出中。 若要處理該輸出,您可以建立「For each」迴圈,以針對陣列中的每個項目重複執行一或多個動作。

  1. 在 [將變數初始化] 底下,選取 [新增動作]。 在搜尋方塊中,輸入 "for each" 作為篩選條件。

  2. 從 [動作] 清單中,選取 [For each - 控制] 動作。

  3. 在 [選取先前步驟中的輸出] 方塊中選取。 當 [動態內容] 清單出現時選取 [主體],也就是所剖析 JSON 的輸出。

  4. 針對 JSON 主體的每個元素,我們想要設定條件。 從動作群組中選取 [控制]

  5. 在 [動作] 清單中,選取 [條件-控制]。 「條件-控制」是會將您工作流程中的資料與特定值或欄位進行比較的控制結構。 接著,您可以指定要根據資料是否符合條件來執行的各種不同動作。

  6. 在 [條件] 動作的根目錄中,將邏輯作業變更為 [Or]

  7. 檢查 ExpressRoute 網路閘道向兩個 BGP 對等體公告的網路首碼數目值。 您可以在 [動態內容] 中的「numRoutePeer1」和「numRoutePeer2」中取得路由數目。 在值方塊中,輸入 numRoutePeer1 的值。

  8. 若要在條件中再新增一個資料列,請選擇 [新增] > [新增資料列]。 在第二個方塊中,從 [動態內容] 選取 [numRoutePeer2]

  9. 當兩個動態變數 (numRoute1 或 numRoute2) 的其中一個大於閾值時,邏輯條件為 true。 在此範例中,閾值會固定為 800 (最大值 1000 個路由的 80%)。 您可以變更閾值,以符合您的需求。 為求一致,此值應與 Runbook PowerShell 指令碼中所用的值相同。

  10. 在 [若為 true] 底下,格式化並建立動作以透過電子郵件傳送警示。 在 [選擇動作] 中,搜尋並選取 [變數]

  11. 在 [變數] 中,選取 [新增動作]。 在 [動作] 清單中,選取 [設定變數]

  12. 在 [名稱] 中,選取先前所建立、名為 EmailBody 的變數。 針對 [值],貼上要格式化警示電子郵件所需的 HTML 指令碼。 使用 [動態內容] 來包含 JSON 主體的值。 在設定好這些設定之後,結果就是變數 Emailbody 會包含與警示相關的所有資訊 (採用 HTML 格式)。

8.新增電子郵件連接器

Logic Apps 提供了許多電子郵件連接器。 在此範例中,我們會新增 Outlook 連接器,以透過電子郵件傳送警示。 在 [設定變數] 底下,選取 [新增動作]。 在 [選擇動作] 中,於搜尋方塊內輸入「傳送電子郵件」。

  1. 選取 [Office 365 Outlook]

  2. 在 [動作] 清單中,選取 [傳送電子郵件 (V2)]

  3. 登入以建立連向 Office 365 Outlook 的連線。

  4. 在 [主體] 欄位中,選取 [新增動態內容]。 從 [動態內容] 面板,新增變數 Emailbody。 填寫 [主旨] 和 [收件者] 欄位。

  5. [傳送電子郵件 (v2)] 動作會完成工作流程的設定。

    傳送電子郵件 v2

9.工作流程驗證

最後一步是工作流程驗證。 在 [Logic Apps 概觀] 中,選取 [執行觸發程序]。 選取 [週期]。 您可以在 [執行歷程記錄] 中監視和驗證工作流程。

執行觸發程式

下一步

若要深入了解如何自訂工作流程,請參閱 Azure Logic Apps