Edited at

Amazon Elasticsearch Service × Kibanaでindex復元エラー:cannot restore index [.kibana] because it's open


概要

Amazon Elasticsearch Service × Kibana で構築されたシステムで、

_restore apiでindexを復元するときに、

「cannot restore index [.kibana] because it's open」

というエラーについてメモします。


要因

Elasticsearch バージョン 5.1 以降では、Amazon ES が .kibana インデックスをモニタリングし、削除されている場合は再作成します。この動作により、復元が失敗します。


前提知識まとめ

・aws関連

・Elasticsearch関連(https://www.elastic.co/guide/jp/index.html)

・Kibana関連(https://www.elastic.co/products/kibana)


要件

esに登録されたデータやindexに対して、バックアップを取った時点に復元すること。


先に結論

index.kibana(Kibana自身の仕組み用)は復元できなくて、その以外のindexは指定して復元できる。

↓↓↓ AWSサポートセンターに確認した結果:

index.kibana(Kibana自身の仕組み用)は復元もできる。


通常の流れ

① snapshot apiでsnapshotを作成

② 
restore apiでindexを復元

公式参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html#modules-snapshots


実際にやりながら問題点を説明

※Kibana consoleで操作、検証


初期状態

GET /_cat/indices/*?v



.kibanaのindexはデフォルトとして存在する。

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size

yellow open .kibana abcdefghijklmnopqrstu 1 1 1 0 3.6kb 3.6kb


データやindexを投入後(投入操作は省略)

GET /_cat/indices/*?v

投入されたindexのtest-index-1、test-index-2が存在する。

health status index                   uuid                   pri rep docs.count docs.deleted store.size pri.store.size

yellow open .kibana abcdefghijklmnopqrstu 1 1 1 0 3.6kb 3.6kb
yellow open test-index-1 klmnopqrstuabcdefghij 5 1 1 0 9.3kb 9.3kb
yellow open test-index-2 pqrstuabcdefghijklmno 5 1 5 0 9.4kb 9.4kb


現時点(index三つある)のsnapshotを作成(snapshot repositoryの作成は省略)

PUT _snapshot/es-backup-repo/my-snapshot


作成されたsnapshotの様子を見る

GET /_snapshot/es-backup-repo/_all



snapshotは全indexが入ってる

...省略...

"indices": [
".kibana",
"test-index-1",
"test-index-2"
],
...省略...


現在すべてのindexを削除して復元する

DELETE *



削除後

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size

yellow open .kibana jklmnopqrstuabcdefghi 1 1 1 0 3.6kb 3.6kb

えええええーーーー

初期に存在する.kibanaは削除されていない

そのまま復元なら

POST /_snapshot/es-backup-repo/my-snapshot/_restore



.kibanaが存在するので、復元ができない。

{

"error": {
"root_cause": [
{
"type": "snapshot_restore_exception",
"reason": "[es-backup-repo:my-snapshot/CAAUJ6GJSPCtkOuwSiGDnw] cannot restore index [.kibana] because it's open"
}
],
"type": "snapshot_restore_exception",
"reason": "[es-backup-repo:my-snapshot/CAAUJ6GJSPCtkOuwSiGDnw] cannot restore index [.kibana] because it's open"
},
"status": 500
}


解決案


.kibana以外のindexを復元することなら

indesを指定すればよい

POST /_snapshot/es-backup-repo/my-snapshot/_restore

{
"indices": "test-index-*"
}

確認

GET /_cat/indices/*?v

復元できた

health status index                   uuid                   pri rep docs.count docs.deleted store.size pri.store.size

yellow open .kibana jklmnopqrstuabcdefghi 1 1 1 0 3.6kb 3.6kb
yellow open test-index-1 fghijklmnopqrstuabcde 5 1 1 0 9.3kb 9.3kb
yellow open test-index-2 mnopqrstuabcdefghijkl 5 1 5 0 9.4kb 9.4kb


.kibanaを復元しようにはどうする???

aws公式案:https://aws.amazon.com/jp/premiumsupport/knowledge-center/elasticsearch-kibana-error/

上記の超最近(公開日: 2018 年 08 月 31 日)の案は、やってみて、残念でだめだった。

原因は、既存のindex[.kibana]がrenameしても、reindexしても、削除できないこと。

(削除された一瞬にまた自動的.kibanaを作り直すこと。)


追記:

AWSサポートセンターへ問い合わせて、下記のような結果でした。

【2には、reindex API は dest の index が open の状態で存在していたとしても source のドキュメントを dest のドキュメントに移行可能であること、この操作によりスナップショットからリストアされた restored_.kibana インデックスの内容を .kibana インデックスに復元できるもの】って、

renameされたものindexは外見(uid)から見れば何も変わってないですが、中身もちゃんと復旧されたということですよね。