Экспорт данных из рабочей области Log Analytics в учетную запись хранения с помощью Logic Apps

В этой статье описывается метод, который позволяет Azure Logic Apps запрашивать данные из рабочей области Log Analytics в Azure Monitor и отправлять их в служба хранилища Azure. Используйте этот процесс, если необходимо экспортировать данные журналов Azure Monitor для аудита и соответствия сценариям или разрешить другой службе получать эти данные.

Другие методы экспорта

Метод, рассмотренный в этой статье, описывает запланированный экспорт из запроса журнала с помощью приложения логики. Другие варианты экспорта данных для определенных сценариев:

Обзор

В этой процедуре используется соединитель журналов Azure Monitor, который позволяет запускать запрос журнала из приложения логики и использовать его выходные данные в других действиях в рабочем процессе. Соединитель Хранилище BLOB-объектов Azure используется в этой процедуре для отправки выходных данных запроса в хранилище.

Screenshot that shows a Logic Apps overview.

При экспорте данных из рабочей области Log Analytics ограничьте объем данных, обработанных рабочим процессом Logic Apps. Отфильтруйте и агрегируйте данные журнала в запросе, чтобы уменьшить необходимые данные. Например, если необходимо экспортировать события входа, фильтруйте необходимые события и проектируйте только необходимые поля. Например:

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

При экспорте данных по расписанию используйте ingestion_time() функцию в запросе, чтобы убедиться, что вы не пропустите данные с опозданием. Если данные задерживаются из-за проблем с сетью или платформой, использование времени приема гарантирует, что данные включены в следующее выполнение Logic Apps. Пример см. в шаге "Добавление действия журналов Azure Monitor" в разделе процедуры Logic Apps.

Необходимые компоненты

Перед началом этой процедуры необходимо выполнить следующие предварительные требования:

  • Рабочая область Log Analytics: пользователь, создающий приложение логики, должен иметь по крайней мере разрешение на чтение рабочей области.
  • служба хранилища учетная запись. Учетная запись хранения не должна находиться в той же подписке, что и рабочая область Log Analytics. Пользователь, создающий приложение логики, должен иметь разрешение на запись в учетную запись хранения.

Ограничения соединителей

Рабочие области Log Analytics и запросы журналов в Azure Monitor — это службы мультитенантности, которые включают ограничения для защиты и изоляции клиентов и поддержания качества обслуживания. При запросе большого объема данных рассмотрите следующие ограничения, которые могут повлиять на настройку повторения Logic Apps и запроса журнала:

  • Запросы журнала не могут возвращать более 500 000 строк.
  • Запросы журнала не могут возвращать более 64 000 000 байт.
  • Запросы журналов не могут выполняться дольше 10 минут.
  • Соединитель Log Analytics ограничен 100 вызовами в минуту.

Процедура Logic Apps

В следующих разделах описана процедура.

Создание контейнера в учетной записи хранения

Используйте процедуру создания контейнера для добавления контейнера в учетную запись хранения для хранения экспортированных данных. В этой статье для контейнера используется имя loganalytics-data, но вы можете выбрать любое другое.

Создание рабочего процесса приложения логики

  1. Перейдите к разделу Logic Apps на портале Azure и выберите Добавить. Выберите подписку, группу ресурсов и регион для хранения нового приложения логики. Затем присвойте ему уникальное имя. Вы можете включить параметр Log Analytics для сбора сведений о данных и событиях среды выполнения, как описано в разделе "Настройка журналов Azure Monitor" и сбор диагностика данных для Azure Logic Apps. Этот параметр не требуется для использования соединителя журналов Azure Monitor.

    Screenshot that shows creating a logic app.

  2. Выберите Просмотр и создание, а затем нажмите кнопку Создать. После завершения развертывания выберите "Перейти к ресурсу", чтобы открыть конструктор Logic Apps.

Создание триггера для рабочего процесса

В разделе Начинаем с часто используемого триггера выберите элемент Повторение. Этот параметр создает рабочий процесс приложения логики, который автоматически выполняется через регулярный интервал. В поле "Частота" действия выберите "День". В поле "Интервал" введите 1, чтобы запустить рабочий процесс один раз в день.

Screenshot that shows a Recurrence action.

Добавление действия журналов Azure Monitor

Действие журналов Azure Monitor позволяет указать запрос для выполнения. Запрос журнала, используемый в этом примере, оптимизирован для почасового повторения. Он собирает данные, отбираемые в течение определенного времени выполнения. Например, если рабочий процесс выполняется в 4:35, диапазон времени будет составлять от 3:00 до 4:00. Если приложение логики изменится на другую частоту, необходимо также изменить запрос. Например, если для выполнения повторения выполняется ежедневно, в запросе задано значение startTimestartofday(make_datetime(year,month,day,0,0)).

Вам будет предложено выбрать клиент, чтобы предоставить доступ к рабочей области Log Analytics с учетной записью, которую рабочий процесс будет использовать для выполнения запроса.

  1. Выберите + Новый шаг, чтобы добавить действие, выполняемое после действия повторения. В разделе " Выбор действия" введите Azure Monitor. Затем выберите журналы Azure Monitor.

    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 , параметр Set in query недоступен. Дополнительные сведения о диапазоне времени см. в область запроса. Выберите Последние 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 и создает объект, который необходимо сохранить в большом двоичном объекте.

  1. Выберите +Создать шаг, а затем нажмите кнопку +Добавить действие. В разделе " Выбор операции" введите создание. Затем выберите действие Compose .

    Screenshot that shows selecting a Compose action.

  2. Выберите поле "Входные данные", чтобы отобразить список значений из предыдущих действий. Выберите Текст из действия Анализ JSON. Этот анализ выходных данных выполняется из запроса журнала.

    Screenshot that shows selecting a body for a Compose action.

Добавление действия создания BLOB-объектов

Действие "Создать большой двоичный объект " записывает в хранилище созданную JSON.

  1. Выберите +Создать шаг, а затем нажмите кнопку +Добавить действие. В разделе " Выбор операции" введите большой двоичный объект. Затем выберите действие "Создать большой двоичный объект ".

    Screenshot that shows selecting the Create Blob action.

  2. Введите имя подключения к учетной записи хранения в Подключение ion Name. Затем щелкните значок папки в поле пути к папке, чтобы выбрать контейнер в учетной записи хранения. Выберите имя 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 и выберите свою учетную запись хранения. Выберите элемент Большие двоичные объекты. Затем выберите контейнер, указанный в действии "Создать большой двоичный объект ". Выберите один из больших двоичных объектов и выберите команду "Изменить большой двоичный объект".

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"
                }
            }
        }
    }
}

Следующие шаги

  • Дополнительные сведения о запросах журнала в Azure Monitor см. в этой статье.
  • Дополнительные сведения о Logic Apps.
  • Ознакомьтесь с дополнительными сведениями о Power Automate.