🐼

Elasticsearch でインデックスの削除に失敗したときの対処法

に公開

Elasticsearch でインデックスの削除に失敗したときの対処法

問題

Elasticsearchでインデックスを削除しようとした時に、スナップショット処理中で削除できないというエラーが発生。

curl -XDELETE https://[ELASTICSEARCH_ENDPOINT]/${target_index}

上記を実行すると下記のようなエラーが表示される:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Cannot delete indices that are being snapshotted: [[index-example-edit-log-2025-02-12/XXXXXXXXXXXX]]. Try again after snapshot finishes or cancel the currently running snapshot."
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Cannot delete indices that are being snapshotted: [[index-example-edit-log-2025-02-12/XXXXXXXXXXXX]]. Try again after snapshot finishes or cancel the currently running snapshot."
  },
  "status": 400
}

解決策

このエラーは、削除しようとしているインデックスが現在スナップショット処理中であるために発生している模様。次の2つの方法がある。

1. スナップショットの完了を待つ

スナップショットプロセスが自然に完了するのを待ってから、再度削除コマンドを実行する。

2. 実行中のスナップショットを確認し、必要に応じてキャンセルする

まず、現在実行中のスナップショットを確認。

curl -XGET "https://[ELASTICSEARCH_ENDPOINT]/_snapshot/_all/_current"

ただし、_all というリポジトリが存在しない場合は、次のようなエラーが返ってくる:

{
  "error": {
    "root_cause": [
      {
        "type": "repository_missing_exception",
        "reason": "[_all] missing"
      }
    ],
    "type": "repository_missing_exception",
    "reason": "[_all] missing"
  },
  "status": 404
}

その場合は、まずリポジトリの一覧を確認:

curl -XGET "https://[ELASTICSEARCH_ENDPOINT]/_snapshot"

リポジトリ名が分かったら、そのリポジトリで進行中のスナップショットを確認:

curl -XGET "https://[ELASTICSEARCH_ENDPOINT]/_snapshot/[リポジトリ名]/_current"

Amazon ES(Elasticsearch Service)を使用している場合は、cs-automated というリポジトリ名がデフォルトで使われていることが多いとのこと:

curl -XGET "https://[ELASTICSEARCH_ENDPOINT]/_snapshot/cs-automated/_current"

スナップショット情報が取得できたら、次のようなJSONが返ってくる:

{
  "snapshots": [
    {
      "snapshot": "2025-04-03t06-14-07.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "uuid": "XXXXXXXXXXXX",
      "version_id": 6030199,
      "version": "6.3.1",
      "indices": [
        "example-index-1",
        "example-index-2",
        "index-example-edit-log-2025-02-12",
        "..."
      ],
      "include_global_state": true,
      "state": "IN_PROGRESS",
      "start_time": "2025-04-03T06:14:07.892Z",
      "start_time_in_millis": 1743660847892,
      "end_time": "1970-01-01T00:00:00.000Z",
      "end_time_in_millis": 0,
      "duration_in_millis": -1743660847892,
      "failures": [],
      "shards": {
        "total": 0,
        "failed": 0,
        "successful": 0
      }
    }
  ]
}

スナップショットをキャンセルするには、以下のコマンド:

curl -XDELETE "https://[ELASTICSEARCH_ENDPOINT]/_snapshot/[リポジトリ名]/[スナップショット名]"

例えば:

curl -XDELETE "https://[ELASTICSEARCH_ENDPOINT]/_snapshot/cs-automated/2025-04-03t06-14-07.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

スナップショットをキャンセルした後、インデックスの削除を再度試みることができる:

curl -XDELETE "https://[ELASTICSEARCH_ENDPOINT]/${target_index}"

注意事項

スナップショットはデータのバックアップですので、本当に必要な場合にのみキャンセルする。
可能であれば、スナップショットの完了を待ってからインデックスを削除する方が安全。
自分の場合は、しばらくしたら、完了していた。

Discussion