Elasticsearch est un moteur de recherche et d’analyse puissant, largement utilisé pour gérer de grandes quantités de données. Cependant, il peut être nécessaire de supprimer un index pour libérer de l’espace, nettoyer des données obsolètes ou réorganiser une structure de données. Ce guide détaillé explique comment supprimer un index dans Elasticsearch à l’aide de l’API DELETE, en couvrant les méthodes d’authentification (API Key, Basic Auth, Bearer Auth), les précautions à prendre, et les meilleures pratiques pour garantir une suppression sécurisée et efficace.

Prérequis pour supprimer un index dans Elasticsearch

Avant de supprimer un index, assurez-vous de :

  • Avoir les privilèges nécessaires : Vous devez disposer de l’autorisation delete_index pour l’index cible.
  • Vérifier l’index : Confirmez que l’index n’est pas le write index actuel d’un data stream (voir la section sur les data streams ci-dessous).
  • Effectuer une sauvegarde : Si les données sont critiques, créez un snapshot avant la suppression.
  • Vérifier l’état du cluster : Assurez-vous que le cluster est stable (utilisez GET _cluster/health pour vérifier).
  • Accéder à l’API REST : Utilisez un outil comme curl, Postman, ou Kibana Dev Tools pour envoyer des requêtes.

Considérations Importantes

Index dans un Data Stream

Vous ne pouvez pas supprimer directement l’index d’écriture actuel d’un data stream. Pour le faire :

  1. Effectuez un rollover du data stream pour créer un nouvel index d’écriture :
    bash
    POST /my-data-stream/_rollover
  2. Une fois le nouvel index créé, supprimez l’ancien index avec l’API DELETE.

Alias et Wildcards

  • Alias : Les alias d’index ne peuvent pas être supprimés directement avec l’API DELETE pour les index. Utilisez l’API DELETE /<index>/_alias/<alias> pour supprimer un alias.
  • Wildcards : Par défaut, l’utilisation de wildcards (*) ou _all pour cibler plusieurs index est désactivée. Pour l’activer, modifiez le paramètre de cluster action.destructive_requires_name à false (attention, cela peut être risqué) :
    bash
    PUT _cluster/settings
    {
      "persistent": {
        "action.destructive_requires_name": false
      }
    }

Impact sur les Performances

La suppression d’un index, surtout s’il est volumineux, peut augmenter temporairement la charge du cluster (I/O disque, CPU, trafic réseau). Planifiez la suppression pendant les périodes de faible activité et surveillez la santé du cluster avec GET _cat/health?v.

Comment Supprimer un Index avec l’API DELETE

Elasticsearch propose une API REST simple pour supprimer un index via une requête DELETE. Voici les étapes pour effectuer cette opération, avec des exemples utilisant différentes méthodes d’authentification (API Key, Basic Auth, Bearer Auth).

Syntaxe Générale pour supprimer un index dans Elasticsearch

DELETE /<index>
  • <index> : Nom de l’index ou liste d’index séparés par des virgules (par exemple, index1,index2).
  • Les paramètres de requête optionnels incluent allow_no_indices, expand_wildcards, ignore_unavailable, master_timeout, et timeout

Étape 1 : Vérifier les Index ExistantsAvant de supprimer un index, listez les index disponibles pour confirmer le nom exact :

GET _cat/indices?v

Exemple de sortie :

health status index         uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   my-index-001  aBcDeFgHiJkLmNoPqRsT   5   1   1000       0            1.2gb      600mb
green  open   my-index-002  uVwXyZaBcDeFgHiJkLmN   5   1   500        0            800mb      400mb

Étape 2 : Supprimer un IndexMéthode 1 : Utilisation de l’API Key AuthenticationSi votre cluster utilise une clé API pour l’authentification :

  1. Assurez-vous d’avoir une clé API valide. Créez-en une si nécessaire via :
    POST /_security/api_key
    {
      "name": "my-api-key",
      "role_descriptors": {
        "role": {
          "cluster": ["all"],
          "indices": {
            "my-index-*": {
              "privileges": ["delete_index"]
            }
          }
        }
      }
    }

    Réponse :

    json

    {
      "id": "VuaCfGcBCdbkQm-e5aOx",
      "name": "my-api-key",
      "api_key": "ui2lp2axTGuGuDtlkzrAUA"
    }
  2. Encodez la clé API en Base64 (id:api_key) pour l’utiliser dans l’en-tête Authorization. Par exemple, pour VuaCfGcBCdbkQm-e5aOx:ui2lp2axTGuGuDtlkzrAUA :
    echo -n "VuaCfGcBCdbkQm-e5aOx:ui2lp2axTGuGuDtlkzrAUA" | base64

    Sortie : VnVhQ2ZHY0JDZGJrUW0tZTNhT3g6dWkybHAyYXhUR3VHdUR0bGt6ckFVA==

  3. Supprimez l’index avec curl :
    curl -X DELETE -H "Authorization: ApiKey VnVhQ2ZHY0JDZGJrUW0tZTNhT3g6dWkybHAyYXhUR3VHdUR0bGt6ckFVA==" "http://localhost:9200/my-index-001"

    Réponse en cas de succès :

    json
    {
      "acknowledged": true
    }

Méthode 2 : Utilisation de Basic AuthenticationSi vous utilisez un nom d’utilisateur et un mot de passe :

  1. Encodez les identifiants en Base64 (username:password). Par exemple, pour elastic:password :
    echo -n "elastic:password" | base64

    Sortie : ZWxhc3RpYzpwYXNzd29yZA==

  2. Supprimez l’index :
    curl -X DELETE -H "Authorization: Basic ZWxhc3RpYzpwYXNzd29yZA==" "http://localhost:9200/my-index-001"

    Réponse en cas de succès :

    {
      "acknowledged": true
    }

Méthode 3 : Utilisation de Bearer AuthenticationSi votre cluster utilise des tokens Bearer (par exemple, via OAuth ou un fournisseur d’identité) :

  1. Obtenez un token Bearer valide auprès de votre système d’authentification.
  2. Supprimez l’index :
    curl -X DELETE -H "Authorization: Bearer <votre_token>" "http://localhost:9200/my-index-001"

    Réponse en cas de succès :

    {
      "acknowledged": true
    }

Étape 3 : Supprimer Plusieurs IndexPour supprimer plusieurs index en une seule requête, listez-les séparés par des virgules :

bash
curl -X DELETE -H "Authorization: ApiKey VnVhQ2ZHY0JDZGJrUW0tZTNhT3g6dWkybHAyYXhUR3VHdUR0bGt6ckFVA==" "http://localhost:9200/my-index-001,my-index-002"

Ou utilisez un wildcard (si action.destructive_requires_name est défini à false) :

curl -X DELETE -H "Authorization: ApiKey VnVhQ2ZHY0JDZGJrUW0tZTNhT3g6dWkybHAyYXhUR3VHdUR0bGt6ckFVA==" "http://localhost:9200/my-index-*"

Étape 4 : Vérifier la SuppressionConfirmez que l’index a été supprimé :

GET _cat/indices?v

L’index supprimé ne devrait plus apparaître dans la liste.

Paramètres de Requête Utiles

  • allow_no_indices (boolean, défaut : true) : Si false, la requête échoue si un index cible est manquant ou fermé.
  • expand_wildcards (string, défaut : open) : Définit quels types d’index les wildcards peuvent cibler (all, open, closed, hidden, none).
  • ignore_unavailable (boolean, défaut : false) : Si true, ignore les index manquants ou fermés sans erreur.
  • master_timeout (string, défaut : 30s) : Temps d’attente pour une connexion au nœud maître.
  • timeout (string, défaut : 30s) : Temps d’attente pour une réponse.
curl -X DELETE -H "Authorization: ApiKey VnVhQ2ZHY0JDZGJrUW0tZTNhT3g6dWkybHAyYXhUR3VHdUR0bGt6ckFVA==" "http://localhost:9200/my-index-001?allow_no_indices=true&ignore_unavailable=true"

FAQ

Puis-je supprimer plusieurs index à la fois ?

Oui, utilisez une liste séparée par des virgules (index1,index2) ou un wildcard (my-index-*) si autorisé.

Comment vérifier si un index a été supprimé ?

Utilisez GET _cat/indices?v pour lister les index restants.

Que faire si je reçois une erreur de timeout ?

Augmentez les paramètres timeout ou master_timeout, ou vérifiez la connectivité au nœud maître.

Puis-je récupérer un index supprimé ?

Non, sauf si vous avez un snapshot. Configurez des sauvegardes régulières pour éviter les pertes de données.

Comment supprimer un index via Kibana ?

Dans Kibana Dev Tools, exécutez :
DELETE /my-index-001
Assurez-vous que votre utilisateur Kibana a les privilèges nécessaires.