Share via


使用邏輯應用程式從 Log Analytics 工作區將資料匯出至儲存體帳戶

本文描述使用 Azure Logic Apps 在 Azure 監視器查詢 Log Analytics 工作區的資料並傳送至 Azure 儲存體的方法。 當您需要匯出 Azure 監視器記錄資料以供稽核和合規性案例使用,或允許其他服務擷取此資料時,請使用此程序。

其他匯出方法

本文中討論的方法描述使用邏輯應用程式來排程記錄查詢匯出。 匯出特定案例資料的其他選項包括:

概觀

此程序使用 Azure 監視器記錄連接器,可讓您從邏輯應用程式執行記錄查詢,並在工作流程的其他動作中使用其輸出。 此程序使用 Azure Blob 儲存體連接器將查詢輸出傳送至儲存體。

Screenshot that shows a Logic Apps overview.

從 Log Analytics 工作區匯出資料時,限制 Log Analytics 工作程序處理的資料量。 篩選並彙總查詢中的記錄資料,以減少所需的資料。 例如,如果您需要匯出登入事件、篩選必要事件,並只投影必要欄位。 例如:

SecurityEvent
| where EventID == 4624 or EventID == 4625
| project TimeGenerated , Account , AccountType , Computer

當您依排程匯出資料時,請在查詢中使用 ingestion_time() 函式,以確保您不會錯過延遲抵達的資料。 如果資料因網路或平台問題而延遲,則使用擷取時間可確保資料會在下一次 Logic App 執行時納入。 例如,請參閱邏輯應用程序一節中的「新增 Azure 監視器記錄動作」步驟。

必要條件

啟動此程序之前,必須先完成下列先決條件:

  • Log Analytics 工作區:建立邏輯應用程式的使用者至少必須具備工作區的讀取權限。
  • 儲存體帳戶:儲存體帳戶不一定要與 Log Analytics 工作區位於相同的訂閱中。 建立邏輯應用程式的使用者必須具備儲存體帳戶的寫入權限。

連接器限制

Azure 監視器中的 Log Analytics 工作區和記錄查詢是多租用服務,其中所含的限制會保護及隔離客戶和維護服務品質。 查詢大量資料時,請考慮下列限制,這些限制可能會影響 Logic Apps 定期和記錄查詢的設定方式:

  • 記錄查詢傳回的資料列數不能超過 500,000。
  • 記錄查詢傳回的大小不能超過 64,000,000 位元組。
  • 記錄查詢執行時間不能超過 10 分鐘。
  • Log Analytics 連接器限制為每分鐘 100 個呼叫。

Logic Apps 程序

下列各節將逐步引導您完成此程序。

在儲存體帳戶中建立容器

使用建立容器中的程序,將容器新增至儲存體帳戶,以保存匯出的資料。 本文中用於容器的名稱是 loganalytics-data,但您可以使用任何名稱。

建立邏輯應用程式工作流程

  1. 移至 Azure 入口網站的 [Logic Apps],然後選取 [新增]。 選取 [訂閱]、[資源群組] 和 [區域] 來儲存新的邏輯應用程式。 然後提供唯一的名稱。 您可以開啟 Log Analytics 設定來收集執行階段資料和事件的資訊,如設定 Azure 監視器記錄和收集 Azure Logic Apps 的診斷資料中所描述。 使用 Azure 監視器記錄連接器不需要此設定。

    Screenshot that shows creating a logic app.

  2. 選取 [檢閱 + 建立],然後選取 [建立]。 部署完成後,選取 [移至資源] 以開啟 Logic Apps 設計工具

建立工作流程的觸發程序

在 [從一般觸發程序開始] 底下,選取 [週期]。 此設定會建立自動定期執行的邏輯應用程式工作流程。 在動作的 [頻率] 方塊中,選取 [日]。 在 [間隔] 方塊中,輸入 1 每天執行工作流程一次。

Screenshot that shows a Recurrence action.

新增 Azure 監視器記錄動作

Azure 監視器記錄動作可讓您指定要執行的查詢。 本範例中使用的記錄查詢針對每小時定期進行最佳化。 它會收集針對特定執行時間擷取的資料。 例如,如果工作流程在 4:35 執行,時間範圍會是 3:00 到 4:00。 如果您將邏輯應用程式變更為以不同的頻率執行,則查詢也需要變更。 例如,如果將定期設定為每天執行,則將查詢中的 startTime 設定為 startofday(make_datetime(year,month,day,0,0))

系統會提示您選取租用戶,並使用工作流程將用來執行查詢的帳戶來授與 Log Analytics 工作區的存取權。

  1. 選取 [+ 新增步驟] 以新增在週期動作之後執行的動作。 在 [選擇動作] 底下,輸入 Azure 監視器。 然後選取 [Azure 監視器記錄]

    Screenshot that shows an Azure Monitor Logs action.

  2. 選取 [Azure Log Analytics – 執行查詢並列出結果]

    Screenshot that shows Azure Monitor Logs is highlighted under Choose an action.

  3. 針對您的 Log Analytics 工作區選取 [訂用帳戶] 和 [資源群組]。 針對 [資源類型] 選取 [Log Analytics 工作區]。 然後選取 [資源名稱] 底下的工作區名稱。

  4. 在 [查詢] 視窗新增下列記錄查詢:

    let dt = now();
    let year = datetime_part('year', dt);
    let month = datetime_part('month', dt);
    let day = datetime_part('day', dt);
     let hour = datetime_part('hour', dt);
    let startTime = make_datetime(year,month,day,hour,0)-1h;
    let endTime = startTime + 1h - 1tick;
    AzureActivity
    | where ingestion_time() between(startTime .. endTime)
    | project 
        TimeGenerated,
        BlobTime = startTime, 
        OperationName ,
        OperationNameValue ,
        Level ,
        ActivityStatus ,
        ResourceGroup ,
        SubscriptionId ,
        Category ,
        EventSubmissionTimestamp ,
        ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,
        ResourceId = _ResourceId 
    
  5. [時間範圍] 依據 TimeGenerated 資料行,指定查詢將包含的記錄。 該值應大於查詢中選取的時間範圍。 由於此查詢未使用 TimeGenerated 資料行,因此無法使用 [在查詢中設定] 選項。 如需時間範圍的詳細資訊,請參閱查詢範圍。 在 [時間範圍] 部分選取 [最近 4 小時]。 此設定可確保結果中任何記錄的擷取時間均大於 TimeGenerated

    Screenshot that shows the settings for the new Azure Monitor Logs action named Run query and visualize results.

(選擇性) 新增剖析 JSON 動作

執行查詢並列出結果動作的輸出採用 JSON 格式。 您可以剖析此資料,並在 [撰寫] 動作準備過程中進行操作。

您可以提供 JSON 結構描述來描述您預期收到的承載。 此設計工具會使用此結構描述來剖析 JSON 內容,並產生方便使用的權杖來表示 JSON 內容中的屬性。 您可以在邏輯應用程式的整個工作流程中輕鬆地參考和使用這些屬性。

您可以使用執行查詢與列出結果步驟中的範例輸出。

  1. 選取 Logic Apps 功能區中的 [執行觸發程序]。 然後選取 [執行] 並下載和儲存輸出記錄。 針對之前主體的範例查詢,您可以使用下列的範例輸出:

    {
        "TimeGenerated": "2020-09-29T23:11:02.578Z",
        "BlobTime": "2020-09-29T23:00:00Z",
        "OperationName": "Returns Storage Account SAS Token",
        "OperationNameValue": "MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE",
        "Level": "Informational",
        "ActivityStatus": "Started",
        "ResourceGroup": "monitoring",
        "SubscriptionId": "00000000-0000-0000-0000-000000000000",
        "Category": "Administrative",
        "EventSubmissionTimestamp": "2020-09-29T23:11:02Z",
        "ClientIpAddress": "192.168.1.100",
        "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/monitoring/providers/microsoft.storage/storageaccounts/my-storage-account"
    }
    
  2. 選取 [+ 新增步驟],然後選取 [+ 新增動作]。 在 [選擇作業] 底下,輸入 json,然後選取 [剖析 JSON]

    Screenshot that shows selecting a Parse JSON operator.

  3. 選取 [內容] 方塊以顯示先前活動的值清單。 從 [執行查詢並列出結果] 動作中選取 [本文]。 此輸出來自記錄查詢。

    Screenshot that shows selecting a Body.

  4. 複製稍早儲存的範例記錄。 選取 [使用範例承載來產生結構描述] 並貼上。

    Screenshot that shows parsing a JSON payload.

新增撰寫動作

撰寫動作會採用已剖析的 JSON 輸出,並建立您必須儲存在 blob 中的物件。

  1. 選取 [新增步驟],然後選取 [+ 新增動作]。 在 [選擇作業] 下,輸入撰寫。 然後選取 [撰寫] 動作。

    Screenshot that shows selecting a Compose action.

  2. 選取 [輸入] 方塊以顯示先前活動的值清單。 從 [剖析 JSON] 動作中選取 [本文]。 此剖析的輸出來自記錄查詢。

    Screenshot that shows selecting a body for a Compose action.

新增 [建立 Blob] 動作

[建立 Blob] 動作會將撰寫的 JSON 寫入儲存體。

  1. 選取 [新增步驟],然後選取 [+ 新增動作]。 在 [選擇作業] 底下,輸入 Blob。 然後選取 [建立 Blob] 動作。

    Screenshot that shows selecting the Create Blob action.

  2. 在 [連線名稱] 中輸入儲存體帳戶連線的名稱。 然後在 [資料夾路徑] 方塊中選取資料夾圖示,以選取儲存體帳戶中的容器。 選取 [Blob 名稱] 以查看先前活動的值清單。 選取 [運算式],然後輸入符合您時間間隔的運算式。 對於每小時執行一次的這個查詢,下列運算式會設定前一小時的 Blob 名稱:

    subtractFromTime(formatDateTime(utcNow(),'yyyy-MM-ddTHH:00:00'), 1,'Hour')
    

    Screenshot that shows a blob expression.

  3. 選取 [Blob 內容] 方塊以顯示先前活動的值清單。 然後選取 [撰寫] 區段中的 [輸出]

    Screenshot that shows creating a blob expression.

測試工作流程

若要測試工作流程,請選取 [執行]。 如果工作流程發生錯誤,則會在發生問題的步驟上指出。 您可以檢視執行並深入查看每個步驟,檢視輸入和輸出以調查失敗原因。 必要時,請參閱針對 Azure Logic Apps 中的工作流程失敗進行疑難排解和診斷

Screenshot that shows Runs history.

檢視儲存體中的記錄

移至 Azure 入口網站中的 [儲存體帳戶] 功能表,然後選取您的儲存體帳戶。 選取 [Blob] 圖格。 然後選取您在 [建立 Blob] 動作中指定的容器。 選取其中一個 Blob,然後選取 [編輯 Blob]

Screenshot that shows blob data.

邏輯應用程式範本

選擇性的剖析 JSON 步驟未包含在範本中

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose": {
                "inputs": "@body('Run_query_and_list_results')",
                "runAfter": {
                    "Run_query_and_list_results": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Create_blob_(V2)": {
                "inputs": {
                    "body": "@outputs('Compose')",
                    "headers": {
                        "ReadFileMetadataFromServer": true
                    },
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azureblob']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/files",
                    "queries": {
                        "folderPath": "/logicappexport",
                        "name": "@{utcNow()}",
                        "queryParametersSingleEncoded": true
                    }
                },
                "runAfter": {
                    "Compose": [
                        "Succeeded"
                    ]
                },
                "runtimeConfiguration": {
                    "contentTransfer": {
                        "transferMode": "Chunked"
                    }
                },
                "type": "ApiConnection"
            },
            "Run_query_and_list_results": {
                "inputs": {
                    "body": "let dt = now();\nlet year = datetime_part('year', dt);\nlet month = datetime_part('month', dt);\nlet day = datetime_part('day', dt);\n let hour = datetime_part('hour', dt);\nlet startTime = make_datetime(year,month,day,hour,0)-1h;\nlet endTime = startTime + 1h - 1tick;\nAzureActivity\n| where ingestion_time() between(startTime .. endTime)\n| project \n    TimeGenerated,\n    BlobTime = startTime, \n    OperationName ,\n    OperationNameValue ,\n    Level ,\n    ActivityStatus ,\n    ResourceGroup ,\n    SubscriptionId ,\n    Category ,\n    EventSubmissionTimestamp ,\n    ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,\n    ResourceId = _ResourceId ",
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/queryData",
                    "queries": {
                        "resourcegroups": "resource-group-name",
                        "resourcename": "workspace-name",
                        "resourcetype": "Log Analytics Workspace",
                        "subscriptions": "workspace-subscription-id",
                        "timerange": "Set in query"
                    }
                },
                "runAfter": {},
                "type": "ApiConnection"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {
            "$connections": {
                "defaultValue": {},
                "type": "Object"
            }
        },
        "triggers": {
            "Recurrence": {
                "evaluatedRecurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "recurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "type": "Recurrence"
            }
        }
    },
    "parameters": {
        "$connections": {
            "value": {
                "azureblob": {
                    "connectionId": "/subscriptions/logic-app-subscription-id/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/blob-connection-name",
                    "connectionName": "blob-connection-name",
                    "id": "/subscriptions/logic-app-subscription-id/providers/Microsoft.Web/locations/canadacentral/managedApis/azureblob"
                },
                "azuremonitorlogs": {
                    "connectionId": "/subscriptions/blob-connection-name/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/azure-monitor-logs-connection-name",
                    "connectionName": "azure-monitor-logs-connection-name",
                    "id": "/subscriptions/blob-connection-name/providers/Microsoft.Web/locations/canadacentral/managedApis/azuremonitorlogs"
                }
            }
        }
    }
}

下一步