OpenSearch Serviceドメインの自動スナップショットからリストアしてみる
はじめに
皆様こんにちは、あかいけです。
Amazon OpenSearch Service ドメインでは自動スナップショット機能が提供されており、特に意識せずとも万が一のデータ損失に備えることができます。
ただ、実際にリストアする機会はあまりないため、いざという時に手順を忘れてしまいがちです。
今回は自動スナップショットからインデックスをリストアする手順を実際に試してみたので、その流れをまとめます。
スナップショットの種類について
まずOpenSearch Service ドメインでは、以下の2種類のスナップショットが提供されています。
| 種類 | 説明 | 保持期間 |
|---|---|---|
| 自動スナップショット | 自動的に取得するスナップショット。追加料金なし | 最大336個(約14日分) |
| 手動スナップショット | ユーザーが任意のタイミングで取得するスナップショット。長期保存やクロスリージョン移行に利用 | 削除するまで保持 |
自動スナップショットは1時間ごとに取得され、
ドメインの設定によってcs-automatedまたはcs-automated-enc(保管中のデータを暗号化している場合)リポジトリに保存されます。
リストアしてみる
では実際にリストア手順を試してみます、公式ドキュメントに沿って進めていきます。
今回はVPC内に構築したOpenSearch Serviceドメインに対して、VPC内のCloudShellからcurlコマンドで操作します。
ドメインのアクセスポリシーでマスターユーザーによる認証を設定している場合は、以下のように環境変数を設定しておくと便利です。
ENDPOINT="https://xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com"
USER="user"
PASS="password"
テストデータの準備
まずはリストア検証用のテストデータを作成します。
現在のインデックス一覧を確認します。
curl -XGET "${ENDPOINT}/_cat/indices?v" -u "${USER}:${PASS}"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .plugins-ml-config itmUAIlCSceWGSIJJEIjJw 1 0 1 0 4kb 4kb
green open .plugins-ml-jobs vEPO4iP5QUmO-eHuiQ2Urg 1 0 1 0 6.3kb 6.3kb
green open .opendistro-job-scheduler-lock oZvfkSbyQ_G3jhKxMJQJog 1 0 1 13 50.5kb 50.5kb
green open .kibana_1 JkeUzvTWTMW_W85w85nRHA 1 0 0 0 208b 208b
green open .opendistro_security SXTLGiIuTa6_cTERsR3xRw 1 0 9 1 59.2kb 59.2kb
システム用のインデックス(.で始まるもの)のみが存在している状態です。
次にテスト用インデックスを作成し、ドキュメントを投入します。
for i in {1..3}; do
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
curl -XPOST "${ENDPOINT}/test-index/_doc/${i}" \
-u "${USER}:${PASS}" \
-H 'Content-Type: application/json' \
-d "{\"title\": \"テストドキュメント${i}\", \"content\": \"テストデータ\", \"timestamp\": \"${TIMESTAMP}\"}"
done
再度インデックス一覧を確認すると、test-indexが作成されていることがわかります。
curl -XGET "${ENDPOINT}/_cat/indices?v" -u "${USER}:${PASS}"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test-index xDy1L7XTSByIOCbSH0Y9UA 5 0 3 0 15.7kb 15.7kb
green open .plugins-ml-config itmUAIlCSceWGSIJJEIjJw 1 0 1 0 4kb 4kb
green open .plugins-ml-jobs vEPO4iP5QUmO-eHuiQ2Urg 1 0 1 0 6.3kb 6.3kb
green open .opendistro-job-scheduler-lock oZvfkSbyQ_G3jhKxMJQJog 1 0 1 17 75.8kb 75.8kb
green open .kibana_1 JkeUzvTWTMW_W85w85nRHA 1 0 0 0 208b 208b
green open .opendistro_security SXTLGiIuTa6_cTERsR3xRw 1 0 9 1 59.2kb 59.2kb
ドキュメント数を確認します。
curl -XGET "${ENDPOINT}/test-index/_count" -u "${USER}:${PASS}"
{"count":3,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0}}
3件のドキュメントが投入されています。データ内容も確認しておきます。
curl -XGET "${ENDPOINT}/test-index/_search?pretty" -u "${USER}:${PASS}"
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test-index",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント3",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:28Z"
}
},
{
"_index" : "test-index",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント2",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:28Z"
}
},
{
"_index" : "test-index",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント1",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:27Z"
}
}
]
}
}
スナップショットの確認
テストデータが作成できたので、次は自動スナップショットを確認します。
まずスナップショットリポジトリの一覧を確認します。
curl -XGET "${ENDPOINT}/_snapshot?pretty" -u "${USER}:${PASS}"
{
"cs-automated-enc" : {
"type" : "s3"
}
}
cs-automated-encリポジトリが存在しています。これは保管中のデータが暗号化されているドメインで使用されるリポジトリです。
ほとんどの自動スナップショットは、cs-automated リポジトリに保存されます。ドメインで暗号化された保管中のデータは cs-automated-enc リポジトリに保存されます。検索する手動スナップショットレポジトリが表示されない場合は、ドメインにその登録をしたことを確認します。
次に、このリポジトリ内のスナップショット一覧を確認します。テストデータを投入した直後だと、まだ自動スナップショットに含まれていない可能性があるため、1時間ほど待ってから確認します。
curl -XGET "${ENDPOINT}/_snapshot/cs-automated-enc/_all?pretty" -u "${USER}:${PASS}"
{
"snapshots" : [ {
"snapshot" : "2026-01-08t10-51-54.eba1b1c2-4ada-4741-b137-a571261c644e",
"uuid" : "G5qbDU6cTIG3OaMITa3jYg",
"version_id" : 137247827,
"version" : "3.3.0",
"remote_store_index_shallow_copy" : false,
"indices" : [ ".opensearch-sap-log-types-config", ".opendistro_security", ".kibana_1", ".plugins-ml-jobs", ".plugins-ml-config" ],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2026-01-08T10:51:55.303Z",
"start_time_in_millis" : 1767869515303,
"end_time" : "2026-01-08T10:51:59.111Z",
"end_time_in_millis" : 1767869519111,
"duration_in_millis" : 3808,
"failures" : [ ],
"shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
}
}, {
"snapshot" : "2026-01-08t11-51-10.e25a9c20-4687-a72b-4d64-58044d63671e",
"uuid" : "ebNSiV03TRSnW1piabJQ2w",
"version_id" : 137247827,
"version" : "3.3.0",
"remote_store_index_shallow_copy" : false,
"indices" : [ ".opensearch-sap-log-types-config", ".opendistro-job-scheduler-lock", ".opendistro_security", ".kibana_1", ".plugins-ml-jobs", ".plugins-ml-config" ],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2026-01-08T11:51:11.220Z",
"start_time_in_millis" : 1767873071220,
"end_time" : "2026-01-08T11:51:12.421Z",
"end_time_in_millis" : 1767873072421,
"duration_in_millis" : 1201,
"failures" : [ ],
"shards" : {
"total" : 6,
"failed" : 0,
"successful" : 6
}
} ]
}
この時点ではまだtest-indexがスナップショットのindicesに含まれていません。
しばらく待ってから再度確認します。
{
"snapshots" : [ {
"snapshot" : "2026-01-08t10-51-54.eba1b1c2-4ada-4741-b137-a571261c644e",
"uuid" : "G5qbDU6cTIG3OaMITa3jYg",
"version_id" : 137247827,
"version" : "3.3.0",
"remote_store_index_shallow_copy" : false,
"indices" : [ ".opensearch-sap-log-types-config", ".opendistro_security", ".kibana_1", ".plugins-ml-jobs", ".plugins-ml-config" ],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2026-01-08T10:51:55.303Z",
"start_time_in_millis" : 1767869515303,
"end_time" : "2026-01-08T10:51:59.111Z",
"end_time_in_millis" : 1767869519111,
"duration_in_millis" : 3808,
"failures" : [ ],
"shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
}
}, {
"snapshot" : "2026-01-08t11-51-10.e25a9c20-4687-a72b-4d64-58044d63671e",
"uuid" : "ebNSiV03TRSnW1piabJQ2w",
"version_id" : 137247827,
"version" : "3.3.0",
"remote_store_index_shallow_copy" : false,
"indices" : [ ".opensearch-sap-log-types-config", ".opendistro-job-scheduler-lock", ".opendistro_security", ".kibana_1", ".plugins-ml-jobs", ".plugins-ml-config" ],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2026-01-08T11:51:11.220Z",
"start_time_in_millis" : 1767873071220,
"end_time" : "2026-01-08T11:51:12.421Z",
"end_time_in_millis" : 1767873072421,
"duration_in_millis" : 1201,
"failures" : [ ],
"shards" : {
"total" : 6,
"failed" : 0,
"successful" : 6
}
}, {
"snapshot" : "2026-01-08t12-51-11.d654bb8f-7edd-1e28-8287-50308771b8b6",
"uuid" : "sJXb4NBGTDugevCNO6E_ew",
"version_id" : 137247827,
"version" : "3.3.0",
"remote_store_index_shallow_copy" : false,
"indices" : [ "test-index", ".opensearch-sap-log-types-config", ".opendistro-job-scheduler-lock", ".opendistro_security", ".kibana_1", ".plugins-ml-jobs", ".plugins-ml-config" ],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2026-01-08T12:51:11.354Z",
"start_time_in_millis" : 1767876671354,
"end_time" : "2026-01-08T12:51:12.955Z",
"end_time_in_millis" : 1767876672955,
"duration_in_millis" : 1601,
"failures" : [ ],
"shards" : {
"total" : 11,
"failed" : 0,
"successful" : 11
}
} ]
}
3つ目のスナップショット(2026-01-08t12-51-11...)のindicesにtest-indexが含まれています。
これでテストデータを含むスナップショットが取得できました。
インデックスの削除
リストアを検証するため、test-indexを削除します。
なお、同名のインデックスが既に存在する場合はリストアに失敗するため、事前に削除またはリネームが必要です。
curl -XDELETE "${ENDPOINT}/test-index" -u "${USER}:${PASS}"
{"acknowledged":true}
インデックス一覧を確認し、削除されていることを確認します。
curl -XGET "${ENDPOINT}/_cat/indices?v" -u "${USER}:${PASS}"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .plugins-ml-config itmUAIlCSceWGSIJJEIjJw 1 0 1 0 4kb 4kb
green open .plugins-ml-jobs vEPO4iP5QUmO-eHuiQ2Urg 1 0 1 0 6.3kb 6.3kb
green open .opendistro-job-scheduler-lock oZvfkSbyQ_G3jhKxMJQJog 1 0 1 3 49.2kb 49.2kb
green open .kibana_1 JkeUzvTWTMW_W85w85nRHA 1 0 0 0 208b 208b
green open .opendistro_security SXTLGiIuTa6_cTERsR3xRw 1 0 9 1 59.2kb 59.2kb
test-indexが削除され、システムインデックスのみになりました。
スナップショットからのリストア
いよいよスナップショットからリストアを実行します。
test-indexのみをスナップショットからリストアします。
SNAPSHOT_NAME="2026-01-08t12-51-11.d654bb8f-7edd-1e28-8287-50308771b8b6"
REPOSITORY_NAME="cs-automated-enc"
curl -XPOST "${ENDPOINT}/_snapshot/$REPOSITORY_NAME/$SNAPSHOT_NAME/_restore" \
-u "${USER}:${PASS}" \
-H 'Content-Type: application/json' \
-d '{"indices": "test-index"}'
{"accepted":true}が返ってきたので、リストアが開始されました。
{"accepted":true}
リストア結果の確認
インデックス一覧を確認します。
curl -XGET "${ENDPOINT}/_cat/indices?v" -u "${USER}:${PASS}"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test-index P9fT3g4XRjufCT4BJzvPHg 5 0 3 0 16kb 16kb
green open .plugins-ml-config itmUAIlCSceWGSIJJEIjJw 1 0 1 0 4kb 4kb
green open .plugins-ml-jobs vEPO4iP5QUmO-eHuiQ2Urg 1 0 1 0 6.3kb 6.3kb
green open .opendistro-job-scheduler-lock oZvfkSbyQ_G3jhKxMJQJog 1 0 1 5 61.9kb 61.9kb
green open .kibana_1 JkeUzvTWTMW_W85w85nRHA 1 0 0 0 208b 208b
green open .opendistro_security SXTLGiIuTa6_cTERsR3xRw 1 0 9 1 59.2kb 59.2kb
test-indexが復元されていることが確認できます。
またUUIDが変わっていることがわかります。
(リストア前: xDy1L7XTSByIOCbSH0Y9UA → リストア後: P9fT3g4XRjufCT4BJzvPHg)。
データ内容も確認してみます。
curl -XGET "${ENDPOINT}/test-index/_search?pretty" -u "${USER}:${PASS}"
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test-index",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント3",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:28Z"
}
},
{
"_index" : "test-index",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント2",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:28Z"
}
},
{
"_index" : "test-index",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "テストドキュメント1",
"content" : "テストデータ",
"timestamp" : "2026-01-08T12:35:27Z"
}
}
]
}
}
3件のドキュメントがすべて復元されており、
内容もスナップショット取得時点の状態に戻っていることが確認できました。
さいごに
以上、OpenSearch Serviceの自動スナップショットからインデックスをリストアする手順でした。
今回の検証で確認したポイントは以下の通りです。
- 自動スナップショットは1時間ごとに取得され、
cs-automatedまたはcs-automated-encリポジトリに保存される - リストア前に同名のインデックスが存在する場合は、削除またはリネームが必要
- リストア後はUUIDが新しく割り当てられる
自動スナップショットは追加料金なしで利用できるため、障害時にはまずこの機能での復旧を検討するのがよいかと思います。
ただし、以下のようなケースでは手動スナップショットの利用を検討する必要がありそうです。
- 14日間を超える長期保存が必要な場合
- 別リージョンへのバックアップや移行が必要な場合
- 短時間でインデックスが頻繁に更新され、1時間ごとの自動スナップショットではカバーできない場合
この記事が誰かのお役に立てば幸いです。






