Exportación de datos de un área de trabajo de Log Analytics a la cuenta de almacenamiento mediante Logic Apps
En este artículo se describe un método para usar Azure Logic Apps a fin de consultar datos de un área de trabajo de Log Analytics en Azure Monitor y enviarlos a Azure Storage. Use este proceso cuando necesite exportar los datos de registros de Azure Monitor para escenarios de auditoría y cumplimiento o a fin de permitir que otro servicio recupere estos datos.
Otros métodos de exportación
El método que se explica en este artículo describe una exportación programada a partir de una consulta de registro mediante una aplicación lógica. Entre otras opciones a fin de exportar datos para escenarios concretos se incluyen las siguientes:
- Para exportar datos del área de trabajo de Log Analytics a una cuenta de almacenamiento o a Azure Event Hubs, use la característica de exportación de datos del área de trabajo de Log Analytics de los registros de Azure Monitor. Vea el artículo Exportación de datos del área de trabajo de Log Analytics en Azure Monitor.
- Exportación única mediante una aplicación lógica. Consulte Conector de Azure Monitor Logs para Logic Apps.
- Exportación única a una máquina local mediante un script de PowerShell. Consulte Invoke-AzOperationalInsightsQueryExport.
Información general
En este procedimiento, se usa el conector de registros de Azure Monitor, que le permite ejecutar una consulta de registro desde una aplicación lógica y usar su salida en otras acciones del flujo de trabajo. En este procedimiento se usa el conector de Azure Blob Storage para enviar la salida de la consulta al almacenamiento.
Al exportar datos desde un área de trabajo de Log Analytics, debe limitar la cantidad de datos que procesa el flujo de trabajo de Logic Apps. Filtre y agregue los datos de registro en la consulta para reducir los datos necesarios. Por ejemplo, si necesita exportar eventos de inicio de sesión, filtre por los eventos necesarios y proyecte solo los campos obligatorios. Por ejemplo:
SecurityEvent
| where EventID == 4624 or EventID == 4625
| project TimeGenerated , Account , AccountType , Computer
Cuando exporte los datos en una programación, use la función ingestion_time()
en la consulta para asegurarse de no perder los datos de llegada tardía. Si los datos se retrasan debido a problemas de red o de plataforma, el uso del tiempo de ingesta garantiza que se incluirán en la ejecución siguiente de Logic Apps. Para ver un ejemplo, vea el paso "Agregar una acción Registros de Azure Monitor" en la sección Procedimiento de Logic Apps.
Requisitos previos
Los requisitos previos siguientes deben completarse antes de iniciar este procedimiento:
- Área de trabajo de Log Analytics: el usuario que crea la aplicación lógica debe tener al menos permiso de lectura en el área de trabajo.
- Cuenta de Azure Storage: no es necesario que la cuenta de almacenamiento esté en la misma suscripción que el área de trabajo de Log Analytics. El usuario que crea la aplicación lógica debe tener permiso de escritura en la cuenta de almacenamiento.
Límites de conector
El área de trabajo de Log Analytics y las consultas de registro de Azure Monitor son servicios multiinquilino que incluyen límites para proteger y aislar a los clientes, así como mantener la calidad del servicio. Al consultar una gran cantidad de datos, tenga en cuenta los límites siguientes, que pueden afectar la configuración de la periodicidad de la instancia de Logic Apps y la consulta de registro:
- Las consultas de registro no pueden devolver más de 500 000 filas.
- Las consultas de registro no pueden devolver más de 64 000 000 de bytes.
- Las consultas de registro no se pueden ejecutar durante más de 10 minutos.
- El conector de Log Analytics está limitado a 100 llamadas por minuto.
Procedimiento de Logic Apps
Las secciones siguientes le guiarán por el procedimiento.
Creación de un contenedor en la cuenta de almacenamiento
Use el procedimiento que aparece en Crear un contenedor para agregar a la cuenta de almacenamiento un contenedor que almacene los datos exportados. El nombre que se usa en el contenedor de este artículo es loganalytics-data, pero puede usar el que quiera.
Creación de un flujo de trabajo de aplicación lógica
Vaya a Logic Apps en Azure Portal y seleccione Agregar. Seleccione una Suscripción, Grupo de recursos y Región para almacenar la aplicación lógica nueva. Después, asígnele un nombre único. Puede activar la opción de configuración Log Analytics para recopilar información sobre eventos y datos en tiempo de ejecución, tal como se describe en Configuración de registros de Azure Monitor y recopilación de datos de diagnóstico para Azure Logic Apps. Esta configuración no es necesaria para usar el conector de Azure Monitor Logs.
Seleccione Revisar y crear y, luego, Crear. Cuando la implementación finalice, seleccione Ir al recurso para abrir el Diseñador de aplicaciones lógicas.
Creación de un desencadenador para el flujo de trabajo
En Empezar con un desencadenador común, seleccione Periodicidad. Esta configuración crea un flujo de trabajo de aplicación lógica que se ejecuta automáticamente a intervalos regulares. En el cuadro Frecuencia de la acción, seleccione Día. En el cuadro Intervalo de la acción, escriba 1 para ejecutar el flujo de trabajo una vez al día.
Incorporación de una acción Registros de Azure Monitor
La acción de registros de Azure Monitor le permite especificar la consulta que se va a ejecutar. La consulta de registro que se usa en este ejemplo está optimizada para una periodicidad por hora. Recopila los datos ingeridos durante el tiempo de ejecución determinado. Por ejemplo, si el flujo de trabajo se ejecuta a las 4:35, el intervalo de tiempo sería de 3:00 a 4:00. Si cambia la aplicación lógica para que se ejecute con una frecuencia distinta, también debe cambiar la consulta. Por ejemplo, si establece la periodicidad para que se ejecute a diario, debe establecer startTime
en la consulta en startofday(make_datetime(year,month,day,0,0))
.
Se le pedirá que seleccione un inquilino para conceder acceso al área de trabajo de Log Analytics con la cuenta que va a usar el flujo de trabajo a fin de ejecutar la consulta.
Seleccione + Nuevo paso para agregar una acción que se ejecute después de la acción de periodicidad. En Elegir una acción, escriba azure monitor. Después, seleccione Azure Monitor Logs (Registros de Azure Monitor).
Seleccione Azure Log Analytics: Ejecutar la consulta y mostrar los resultados.
Seleccione las opciones de Suscripción y Grupo de recursos para su área de trabajo de Log Analytics. Seleccione Área de trabajo de Log Analytics para el Tipo de recurso. Luego, seleccione el nombre del área de trabajo en Nombre del recurso.
En la ventana Consulta, agregue la consulta de registro siguiente:
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
El Intervalo de tiempo especifica los registros que se incluirán en la consulta en función de la columna TimeGenerated. El valor debe ser mayor que el intervalo de tiempo seleccionado en la consulta. Como esta consulta no usa la columna TimeGenerated, la opción Establecer en la consulta no está disponible. Para obtener más información sobre el intervalo de tiempo, vea Ámbito de consulta. Seleccione Últimas 4 horas para Intervalo de tiempo. Esto garantiza que se incluirán en los resultados los registros con un tiempo de ingesta mayor que TimeGenerated.
Incorporación de una acción Analizar JSON (opcional)
La salida de la acción Ejecutar consulta y mostrar resultados tiene formato JSON. Puede analizar estos datos y manipularlos como parte de la preparación de la acción Componer.
Puede proporcionar un esquema JSON que describa la carga que espera recibir. El diseñador analiza el contenido JSON mediante este esquema y genera tokens fáciles de usar que representan las propiedades del contenido JSON. Luego, puede hacer referencia fácilmente a estas propiedades y utilizarlas a lo largo del flujo de trabajo de la aplicación lógica.
Puede usar una salida de muestra del paso Ejecutar la consulta y mostrar los resultados.
Seleccione Ejecutar desencadenador en la cinta de opciones de Logic Apps. Luego seleccione Ejecutar y, después, descargue y guarde un registro de salida. Para la consulta de muestra del paso anterior, puede usar la salida de muestra siguiente:
{ "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" }
Seleccione + Nuevo paso y, después, + Agregar una acción. En Elegir una operación, escriba json y, luego, seleccione Analizar JSON.
Seleccione el cuadro Contenido para mostrar una lista de valores de las actividades anteriores. Seleccione Cuerpo en la acción Ejecutar consulta y mostrar resultados. Esta es la salida de la consulta de registro.
Copie el registro de ejemplo guardado anteriormente. Seleccione Usar una carga de ejemplo para generar el esquema y cópielo.
Incorporación de la acción Componer
La acción Componer toma la salida del JSON analizado y crea el objeto que necesita almacenar en el blob.
Seleccione + Nuevo paso y luego + Agregar una acción. En Elegir una operación, escriba compose. Luego, seleccione la acción Redactar.
Seleccione el cuadro Entradas para ver una lista de valores de las actividades anteriores. Seleccione Cuerpo en la acción Analizar JSON. Esta es la salida analizada de la consulta de registro.
Incorporación de la acción Crear blob
La acción Crear blob escribe el JSON compuesto en el almacenamiento.
Seleccione + Nuevo paso y luego + Agregar una acción. En Elegir una operación, escriba blob. Luego seleccione la acción Crear blob.
Escriba un nombre para la conexión a la cuenta de almacenamiento en Nombre de conexión. Luego seleccione el icono de carpeta en el cuadro Ruta de acceso de la carpeta para seleccionar el contenedor de la cuenta de almacenamiento. Seleccione Nombre del blob para ver una lista de valores de las actividades anteriores. Seleccione Expresión y escriba una expresión que coincida con el intervalo de tiempo. Para esta consulta, que se ejecuta cada hora, la expresión siguiente establece el nombre del blob según la hora anterior:
subtractFromTime(formatDateTime(utcNow(),'yyyy-MM-ddTHH:00:00'), 1,'Hour')
Seleccione el cuadro Contenido del blob para mostrar una lista de valores de las actividades anteriores. Luego seleccione Salidas en la sección Redactar.
Probar el flujo de trabajo
Para probar el flujo de trabajo, seleccione Ejecutar. Si el flujo de trabajo tiene errores, se indican en el paso que contiene el problema. Puede ver las ejecuciones y profundizar en cada paso para ver la entrada y la salida a fin de investigar los errores. En caso necesario, vea Solución de problemas y diagnóstico de errores de flujo de trabajo en Azure Logic Apps.
Visualización de registros en el almacenamiento
Vaya al menú Cuentas de almacenamiento de Azure Portal y seleccione su cuenta de almacenamiento. Haga clic en el icono de Blobs. Luego seleccione el contenedor que especificó en la acción Crear blob. Seleccione uno de los blobs y luego Editar blob.
Plantilla de aplicación lógica
El paso opcional de análisis de JSON no se incluye en la plantilla
{
"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"
}
}
}
}
}
Pasos siguientes
- Más información sobre las consultas de registro en Azure Monitor.
- Más información acerca de Logic Apps.
- Más información sobre Power Automate.