OpenSearch Serviceドメインの自動スナップショットからリストアしてみる

OpenSearch Serviceドメインの自動スナップショットからリストアしてみる

2026.01.11

はじめに

皆様こんにちは、あかいけです。

Amazon OpenSearch Service ドメインでは自動スナップショット機能が提供されており、特に意識せずとも万が一のデータ損失に備えることができます。
ただ、実際にリストアする機会はあまりないため、いざという時に手順を忘れてしまいがちです。

今回は自動スナップショットからインデックスをリストアする手順を実際に試してみたので、その流れをまとめます。

スナップショットの種類について

まずOpenSearch Service ドメインでは、以下の2種類のスナップショットが提供されています。

種類 説明 保持期間
自動スナップショット 自動的に取得するスナップショット。追加料金なし 最大336個(約14日分)
手動スナップショット ユーザーが任意のタイミングで取得するスナップショット。長期保存やクロスリージョン移行に利用 削除するまで保持

自動スナップショットは1時間ごとに取得され、
ドメインの設定によってcs-automatedまたはcs-automated-enc(保管中のデータを暗号化している場合)リポジトリに保存されます。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/managedomains-snapshots.html

リストアしてみる

では実際にリストア手順を試してみます、公式ドキュメントに沿って進めていきます。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/managedomains-snapshot-restore.html

今回は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 リポジトリに保存されます。検索する手動スナップショットレポジトリが表示されない場合は、ドメインにその登録をしたことを確認します。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/managedomains-snapshot-restore.html

次に、このリポジトリ内のスナップショット一覧を確認します。テストデータを投入した直後だと、まだ自動スナップショットに含まれていない可能性があるため、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...)のindicestest-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時間ごとの自動スナップショットではカバーできない場合

この記事が誰かのお役に立てば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事