【Azure 事件中心】為應用程式閘道器(Application Gateway with WAF) 配置診斷日誌,傳送到事件中心

路邊兩盞燈發表於2021-06-01

問題描述

在Application Gateway中,開啟WAF(Web application firewall)後,現在需要把訪問的日誌輸出到第三方分析程式碼中進行分析,如何來獲取WAF的診斷日誌呢?

整體方案的拓撲圖如下:

【Azure 事件中心】為應用程式閘道器(Application Gateway with WAF) 配置診斷日誌,傳送到事件中心

本文在實施中將介紹:

1)如何建立Event Hub Namespace(事件中心空間)及Event Hub

2)在Application Gateways(WAF)中配置診斷日誌(Diagnostic Logs)

3)(簡約)官網中如何消費Event Hub中的資料

 

實施方案

 第一步:建立Event Hub Namespace(事件中心空間)

  • 在Azure門戶中進入Event Hub Name 的建立頁面:Create Namespace - Microsoft Azure 由世紀互聯運營
  • Resource Group可以選擇已經存在的任意一個,或者是新建Resource Group,名稱為:waf-rg
  • 在Namespace Name中輸入:waflogtest01
  • Location 一定要輸入與Application Gateway一樣的Location。這樣在配置診斷日誌時才可以自動載入出Event Hub
  • Pricing Tier根據需要選擇。這是測試目的,選擇Basic層
  • 點選“Review + Create” 按鈕,建立資源

【Azure 事件中心】為應用程式閘道器(Application Gateway with WAF) 配置診斷日誌,傳送到事件中心

 

第二步:在Event Hub Namespace中新增Event Hub

進入第一步已建立的Event Hub Namespace頁面, 預設Event Hub目錄列表為空。點選“Add Event Hub” 按鈕。輸入Event Hub Name即可

【Azure 事件中心】為應用程式閘道器(Application Gateway with WAF) 配置診斷日誌,傳送到事件中心

 

第三步:在Application Gateway中配置診斷日誌(Diagnostic Logs),傳送日誌到EventHub中

  • 在Application Gateway頁面,選擇Diagnostic Settings目錄
  • 點選“Add diagnostic setting”連結,進入配置頁面
  •  
  • 勾選上“ApplicationGatewayAccessLog“ “ApplicationGatewayPerformanceLog” ”ApplicationGatewayFirewallLog”
  • 在右側選擇 Stream to an event hub
  • 選擇Event Hub Namespace, Event Hub 以及 訪問的金鑰 event hub policy name

【Azure 事件中心】為應用程式閘道器(Application Gateway with WAF) 配置診斷日誌,傳送到事件中心

 

(附加) 第四步:從 Azure 事件中心接收事件

本部分介紹如何編寫一個使用事件處理器從事件中心接收訊息的 .NET Core 控制檯應用程式。 該事件處理器通過從事件中心管理持久檢查點和並行接收操作,來簡化從這些事件中心接收事件的過程。 事件處理器與特定的事件中心和使用者組相關聯。 它從事件中心內的多個分割槽接收事件,並將其傳遞給處理程式委託,以使用提供的程式碼進行處理。

 

建立 Azure 儲存和 Blob 容器

本快速入門使用 Azure 儲存作為檢查點儲存。 按照以下步驟建立 Azure 儲存帳戶。

  1. 建立 Azure 儲存帳戶

  2. 建立一個 blob 容器

  3. 獲取儲存帳戶的連線字串

    請記下該連線字串和容器名稱。 稍後要在接收程式碼中使用這些資訊。

為接收器建立專案

  1. 在“解決方案資源管理器”視窗中,右鍵單擊“EventHubQuickStart”解決方案,指向“新增”,然後選擇“新建專案”。
  2. 依次選擇“控制檯應用(.NET Core)”、“下一步”。
  3. 輸入 EventHubsReceiver 作為“專案名稱”,然後選擇“建立”。

新增事件中心 NuGet 包

  1. 在選單中選擇“工具” > “NuGet 包管理器” > “包管理器控制檯”。

  2. 執行以下命令安裝 Azure.Messaging.EventHubs NuGet 包:

    Install-Package Azure.Messaging.EventHubs
    
  3. 執行以下命令安裝 Azure.Messaging.EventHubs.Processor NuGet 包:

    Install-Package Azure.Messaging.EventHubs.Processor
    

更新 Main 方法

  1. 在 Program.cs 檔案頂部新增以下 using 語句。

    using System;
    using System.Text;
    using System.Threading.Tasks;
    using Azure.Storage.Blobs;
    using Azure.Messaging.EventHubs;
    using Azure.Messaging.EventHubs.Consumer;
    using Azure.Messaging.EventHubs.Processor;
    
  2. 將事件中心連線字串和事件中心名稱的常量新增到 Program 類。 請將括號中的佔位符替換為在建立事件中心時獲取的適當值。 請將括號中的佔位符替換為建立事件中心和儲存帳戶時獲取的適當值(訪問金鑰 - 主連線字串)。 請確保 {Event Hubs namespace connection string} 是名稱空間級別的連線字串,而不是事件中心字串

        private const string ehubNamespaceConnectionString = "<EVENT HUBS NAMESPACE - CONNECTION STRING>";
        private const string eventHubName = "<EVENT HUB NAME>";
        private const string blobStorageConnectionString = "<AZURE STORAGE CONNECTION STRING>";
        private const string blobContainerName = "<BLOB CONTAINER NAME>";
    
  3. 將 Main 方法替換為以下 async Main 方法。 參閱程式碼註釋瞭解詳細資訊 

        static async Task Main()
        {
            // Read from the default consumer group: $Default
            string consumerGroup = EventHubConsumerClient.DefaultConsumerGroupName;
    
            // Create a blob container client that the event processor will use 
            BlobContainerClient storageClient = new BlobContainerClient(blobStorageConnectionString, blobContainerName);
    
            // Create an event processor client to process events in the event hub
            EventProcessorClient processor = new EventProcessorClient(storageClient, consumerGroup, ehubNamespaceConnectionString, eventHubName);
    
            // Register handlers for processing events and handling errors
            processor.ProcessEventAsync += ProcessEventHandler;
            processor.ProcessErrorAsync += ProcessErrorHandler;
    
            // Start the processing
            await processor.StartProcessingAsync();
    
            // Wait for 30 seconds for the events to be processed
            await Task.Delay(TimeSpan.FromSeconds(30));
    
            // Stop the processing
            await processor.StopProcessingAsync();
        }    
    
  4. 現在,將以下事件和錯誤處理程式方法新增到類中。

        static async Task ProcessEventHandler(ProcessEventArgs eventArgs)
        {
            // Write the body of the event to the console window
            Console.WriteLine("\tReceived event: {0}", Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray()));
    
            // Update checkpoint in the blob storage so that the app receives only new events the next time it's run
            await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken);
        }
    
        static Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs)
        {
            // Write details about the error to the console window
            Console.WriteLine($"\tPartition '{ eventArgs.PartitionId}': an unhandled exception was encountered. This was not expected to happen.");
            Console.WriteLine(eventArgs.Exception.Message);
            return Task.CompletedTask;
        }    
    
  5. 生成專案並確保沒有錯誤。

     備註:有關包含更詳細註釋的完整原始碼,請參閱 GitHub 上的此檔案

  6. 執行接收器應用程式。

  7. 應會看到一條訊息,指出已接收事件。

    已接收事件

    這些事件是前面通過執行傳送器程式傳送到事件中心的三個事件。

 

 

參考資料

事件中心建立https://docs.azure.cn/zh-cn/event-hubs/event-hubs-create
事件中心概念https://docs.azure.cn/zh-cn/event-hubs/event-hubs-about
事件中心分割槽https://docs.azure.cn/zh-cn/event-hubs/event-hubs-features#partitions
吞吐量單位https://docs.azure.cn/zh-cn/event-hubs/event-hubs-scalability#throughput-units
接收傳送事件https://docs.azure.cn/zh-cn/event-hubs/event-hubs-dotnet-standard-getstarted-send

 

相關文章