Partager via


Exporter des données à partir d’un espace de travail Log Analytics vers un compte de stockage en utilisant Logic Apps

Cet article décrit une méthode permettant d’utiliser Azure Logic Apps pour interroger des données à partir d’un espace de travail Log Analytics dans Azure Monitor et les envoyer au Stockage Azure. Utilisez ce processus quand vous devez exporter vos données de journaux Azure Monitor pour des scénarios d’audit et de conformité, ou pour permettre à un autre service de récupérer ces données.

Autres méthodes d’exportation

La méthode présentée dans cet article décrit une exportation planifiée à partir d’une requête de journal avec une application logique. Voici d’autres options d’exportation de données pour des scénarios particuliers :

Vue d’ensemble

Cette procédure utilise le connecteur des journaux Azure Monitor, qui vous permet d’exécuter une requête de journal à partir d’une application logique et d’utiliser sa sortie dans d’autres actions du workflow. Le connecteur de Stockage Blob Azure est utilisé dans cette procédure pour envoyer la sortie de la requête vers le stockage.

Capture d’écran montrant une vue d’ensemble de Logic Apps.

Quand vous exportez des données à partir d’un espace de travail Log Analytics, limitez la quantité des données traitées par votre workflow Logic Apps. Filtrez et agrégez vos données de journal dans la requête pour réduire les données requises. Par exemple, si vous avez besoin d’exporter des événements de connexion, filtrez les événements requis et projetez uniquement les champs requis. Par exemple :

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

Quand vous exportez les données selon une planification, utilisez la fonction ingestion_time() dans votre requête pour vous assurer de ne pas manquer les données d’arrivée tardive. Si les données sont retardées en raison de problèmes de réseau ou de plateforme, l’utilisation du temps d’ingestion garantit qu’elles seront incluses dans la prochaine exécution Logic Apps. Pour obtenir un exemple, consultez l’étape « Ajouter l’action Azure Monitor Logs » dans la section Procédure Logic Apps.

Prérequis

Les prérequis suivants doivent être remplis avant de commencer cette procédure :

  • Espace de travail Log Analytics : l’utilisateur qui crée l’application logique doit disposer au moins d’une autorisation de lecture sur l’espace de travail.
  • Compte de stockage : il ne doit pas nécessairement figurer dans le même abonnement que votre espace de travail Log Analytics. L’utilisateur qui crée l’application logique doit disposer d’une autorisation d’écriture sur le compte de stockage.

Limites des connecteurs

L’espace de travail Log Analytics et les requêtes de journalisation dans Azure Monitor sont des services multilocataires qui incluent des limites pour protéger et isoler les clients ainsi que maintenir la qualité du service. Quand vous interrogez une grande quantité de données, prenez en compte les limites suivantes, qui peuvent affecter la façon dont vous configurez la périodicité Logic Apps et votre requête de journal :

  • Les requêtes de journal ne peuvent pas retourner plus de 500 000 lignes.
  • Les requêtes de journal ne peuvent pas retourner plus de 64 000 000 d’octets.
  • Les requêtes du journal ne peuvent pas s’exécuter pendant plus de 10 minutes.
  • Le connecteur Log Analytics est limité à 100 appels par minute.

Procédure Logic Apps

Les sections suivantes vous guident tout au long de la procédure.

Créer un conteneur dans le compte de stockage

Utilisez la procédure décrite dans Créer un conteneur pour ajouter un conteneur à votre compte de stockage afin de stocker les données exportées. Le nom utilisé pour le conteneur dans cet article est loganalytics-data, mais vous pouvez utiliser n’importe quel nom.

Créer un workflow d’application logique

  1. Accédez à Logic Apps sur le portail Azure, puis sélectionnez Ajouter. Sélectionnez un Abonnement , un Groupe de ressources et une Région de stockage de la nouvelle application logique. Ensuite, attribuez-lui un nom unique. Vous pouvez activer le paramètre Log Analytics pour collecter des informations sur les événements et les données du runtime, comme décrit dans Configurer les journaux Azure Monitor et collecter des données de diagnostic pour Azure Logic Apps. Ce paramètre n’est pas nécessaire pour utiliser le connecteur Azure Monitor Logs.

    Capture d’écran montrant la création d’une application logique.

  2. Sélectionnez Vérifier + créer, puis Créer. Une fois le déploiement terminé, sélectionnez Accéder à la ressource pour ouvrir le concepteur Logic Apps.

Créer un déclencheur pour le workflow

En dessous de Démarrer avec un déclencheur courant, sélectionnez Récurrence. Ce paramètre crée un workflow d’application logique qui s’exécute automatiquement à intervalles réguliers. Dans la zone Fréquence de l’action, sélectionnez Jour. Dans la zone Intervalle, entrez 1 pour exécuter le workflow une fois par jour.

Capture d’écran montrant une action Périodicité.

Ajouter une action Azure Monitor Logs

L’action Azure Monitor logs vous permet de spécifier la requête à exécuter. La requête de journal utilisée dans cet exemple est optimisée pour une périodicité horaire. Elle collecte les données ingérées pendant la durée d’exécution particulière. Par exemple, si le flux de travail s’exécute à 04h35, l’intervalle de temps est de 03h00 à 04h00. Si vous changez l’application logique pour qu’elle s’exécute à une autre fréquence, vous devez également changer la requête. Par exemple, si vous définissez la périodicité sur une exécution quotidienne, vous définissez startTimedans la requête sur startofday(make_datetime(year,month,day,0,0)).

Vous êtes invité à sélectionner un locataire pour lui accorder l’accès à l’espace de travail Log Analytics avec le compte que le workflow utilisera pour exécuter la requête.

  1. Sélectionnez + Nouvelle étape pour ajouter une action qui s’exécute après l’action de récurrence. Sous Choisir une action, entrez azure monitor. Sélectionnez ensuite Journaux Azure Monitor.

    Capture d’écran montrant une action Journaux Azure Monitor.

  2. Sélectionnez Azure Log Analytics – Exécuter la requête et lister les résultats.

    Capture d’écran mettant en évidence Azure Monitor Logs sous Choisir une action.

  3. Sélectionnez l’abonnement et le groupe de ressources pour votre espace de travail Log Analytics. Sélectionnez Espace de travail Log Analytics pour le Type de ressource. Sélectionnez ensuite le nom de l’espace de travail sous Nom de la ressource.

  4. Dans la zone Requête, ajoutez la requête de journal suivante :

    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. L’intervalle de temps spécifie les enregistrements qui seront inclus dans la requête en fonction de la colonne TimeGenerated. La valeur doit être supérieure à l’intervalle de temps sélectionné dans la requête. Étant donné que cette requête n’utilise pas la colonne TimeGenerated, l’option Définir dans la requête n’est pas disponible. Pour plus d’informations sur l’intervalle de temps, consultez Étendue de requête. Sélectionnez 4 dernières heures pour l’intervalle de temps. Ce paramètre garantit que tous les enregistrements avec une durée d’ingestion supérieure à TimeGenerated seront inclus dans les résultats.

    Capture d’écran montrant les paramètres de la nouvelle action Azure Monitor Logs nommée Exécuter une requête et visualiser les résultats.

Ajouter une action Analyser JSON (facultatif)

La sortie de l’action Exécuter la requête et répertorier les résultats est au format JSON. Vous pouvez analyser ces données et les manipuler dans le cadre de la préparation de l’action Composer.

Vous pouvez fournir un schéma JSON qui décrit la charge utile que vous comptez recevoir. Le concepteur analyse le contenu JSON à l’aide de ce schéma et génère des jetons conviviaux qui représentent les propriétés dans votre contenu JSON. Vous pouvez ensuite facilement référencer et utiliser ces propriétés dans l’ensemble de flux de travail de votre application logique.

Vous pouvez utiliser un exemple de sortie de l’étape Exécuter la requête et lister les résultats.

  1. Sélectionnez Exécuter le déclencheur dans le ruban Logic Apps. Sélectionnez ensuite Exécuter, puis téléchargez et enregistrez un enregistrement de sortie. Pour l’exemple de requête de l’étape précédente, vous pouvez utiliser l’exemple de sortie suivant :

    {
        "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": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
        "Category": "Administrative",
        "EventSubmissionTimestamp": "2020-09-29T23:11:02Z",
        "ClientIpAddress": "192.168.1.100",
        "ResourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/monitoring/providers/microsoft.storage/storageaccounts/my-storage-account"
    }
    
  2. Sélectionnez + Nouvelle étape, puis sélectionnez + Ajouter une action. Sous Choisir une opération, entrez json, puis sélectionnez Analyser JSON.

    Capture d’écran montrant la sélection d’un opérateur Analyser JSON.

  3. Sélectionnez la zone Contenu pour afficher la liste des valeurs des activités précédentes. Sélectionnez Corps dans l’action Exécuter la requête et répertorier les résultats. Cette sortie émane de la requête de journal.

    Capture d’écran montrant la sélection d’un corps.

  4. Copiez l’exemple d’enregistrement enregistré précédemment. Sélectionnez Utiliser l’exemple de charge utile pour générer le schéma et collez.

    Capture d’écran montrant l’analyse d’une charge utile JSON.

Ajouter l’action Composer

L’action Composer prend la sortie JSON analysée et crée l’objet que vous devez stocker dans l’objet Blob.

  1. Sélectionnez + Nouvelle étape, puis sélectionnez + Ajouter une action. Sous Choisir une opération, entrez composer. Sélectionnez ensuite l’action Composer.

    Capture d’écran montrant la sélection d’une action Composer.

  2. Sélectionnez la zone Entrées pour afficher la liste des valeurs des activités précédentes. Sélectionnez Corps dans l’action Analyser JSON. Cette sortie analysée émane de la requête de journal.

    Capture d’écran montrant la sélection d’un corps d’une action Composer.

Ajouter l’action Créer un objet blob

L’action Créer un objet blob écrit le code JSON composé dans le stockage.

  1. Sélectionnez + Nouvelle étape, puis sélectionnez + Ajouter une action. Sous Choisir une opération, entrez blob. Sélectionnez ensuite l’action Créer un objet blob.

    Capture d’écran montrant la sélection de l’action Créer un objet blob.

  2. Entrez un nom pour la connexion à votre compte de stockage dans Nom de la connexion. Sélectionnez ensuite l’icône de dossier dans la zone Chemin du dossier pour sélectionner le conteneur dans votre compte de stockage. Sélectionnez Nom de l’objet blob pour afficher la liste des valeurs des activités précédentes. Sélectionnez Expression et entrez une expression qui correspond à votre intervalle de temps. Pour cette requête, qui est exécutée toutes les heures, l’expression suivante définit le nom de l’objet blob selon l’heure précédente :

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

    Capture d’écran montrant une expression d’objet blob.

  3. Sélectionnez la zone Contenu de l’objet blob pour afficher la liste des valeurs des activités précédentes. Sélectionnez ensuite Sorties dans la section Composer.

    Capture d’écran montrant la création d’une expression d’objet blob.

Tester le flux de travail

Pour tester le workflow, sélectionnez Exécuter. Si le workflow comporte des erreurs, elles sont indiquées à l’étape présentant le problème. Vous pouvez afficher les exécutions et explorer chaque étape pour afficher l’entrée et la sortie, afin d’examiner les échecs. Consultez Résoudre les problèmes et diagnostiquer les échecs de workflow dans Azure Logic Apps, si nécessaire.

Capture d’écran montrant Historique des exécutions.

Afficher les journaux dans le stockage

Accédez au menu Comptes de stockage dans le portail Azure et sélectionnez votre compte de stockage. Sélectionnez la vignette Objets blob . Sélectionnez ensuite le conteneur que vous avez spécifié dans l’action Créer un objet blob. Sélectionnez l’un des objets blob, puis sélectionnez Modifier l’objet blob.

Capture d’écran montrant des données d’objet blob.

Modèle Logic App

L’étape facultative d’analyse JSON n’est pas incluse dans le modèle

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

Étapes suivantes