Elasticsearch
Docker Compose でデプロイし、Elasticsearch インデックスの S3 スナップショットリポジトリとして RustFS を使用します。
このガイドでは、分散検索・分析エンジンである Elasticsearch を、インデックスの S3 スナップショットリポジトリとして RustFS に接続します。repository-s3 プラグインを有効にして Elasticsearch を起動し、RustFS をバックエンドとするスナップショットリポジトリを登録し、ドキュメントをインデックスに投入してスナップショットを取得します。その後インデックスを削除し、RustFS から復元して一連の流れを確認します。この流れは docker.elastic.co/elasticsearch/elasticsearch:8.18.0 と rustfs/rustfs-x86-musl:v2.3.1 で検証済みです。
Docker と Compose プラグインが必要です。このデプロイはローカルでの統合テストを目的としており、本番環境向けではありません。
アーキテクチャ
Elasticsearch は主データをローカルディスクに保持し、インデックスのバックアップをスナップショットリポジトリへ退避します。repository-s3 プラグインは、平文 HTTP 上のパススタイルアクセスで S3 API を使い、スナップショットのメタデータとシャードデータのブロブを RustFS に書き込みます。
プロジェクトファイルを作成する
作業ディレクトリを作成します。
mkdir rustfs-elasticsearch
cd rustfs-elasticsearch環境変数ファイルを作成し、2 つの認証情報プレースホルダーを置き換えます。
RUSTFS_ACCESS_KEY=<your-access-key>
RUSTFS_SECRET_KEY=<your-secret-key>バケットには専用の認証情報を使用してください。.env をバージョン管理にコミットしないでください。
Elasticsearch は S3 設定を elasticsearch.yml(機密でない値)とキーストア(認証情報)に分けます。設定ファイルを作成します。
discovery.type: single-node
xpack.security.enabled: false
s3.client.default.endpoint: "rustfs:9000"
s3.client.default.protocol: "http"
s3.client.default.path_style_access: "true"
s3.client.default.region: "us-east-1"Compose ファイルを作成します。
services:
rustfs:
image: rustfs/rustfs-x86-musl:v2.3.1
environment:
RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY}
RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY}
RUSTFS_VOLUMES: /data
RUSTFS_ADDRESS: ":9000"
RUSTFS_CONSOLE_ADDRESS: ":9001"
RUSTFS_CONSOLE_ENABLE: "true"
volumes:
- rustfs-data:/data
ports:
- "9000:9000"
- "9001:9001"
healthcheck:
test: ["CMD", "curl", "-sf", "http://127.0.0.1:9000/health"]
interval: 10s
timeout: 5s
retries: 6
start_period: 10s
networks:
- es
create-bucket:
image: rustfs/rc:latest
depends_on:
rustfs:
condition: service_healthy
environment:
RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY}
RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY}
entrypoint:
- /bin/sh
- -c
- |
until /usr/bin/rc alias set rustfs http://rustfs:9000 "$${RUSTFS_ACCESS_KEY}" "$${RUSTFS_SECRET_KEY}"; do
echo "Waiting for RustFS..."
sleep 2
done
/usr/bin/rc ls rustfs/my-bucket >/dev/null 2>&1 || /usr/bin/rc mb rustfs/my-bucket
networks:
- es
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.18.0
environment:
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
entrypoint: >
bash -c '
bin/elasticsearch-plugin install --batch repository-s3 &&
echo "$${RUSTFS_ACCESS_KEY}" | bin/elasticsearch-keystore add -f -x s3.client.default.access_key &&
echo "$${RUSTFS_SECRET_KEY}" | bin/elasticsearch-keystore add -f -x s3.client.default.secret_key &&
exec bin/elasticsearch'
ports:
- "9200:9200"
depends_on:
create-bucket:
condition: service_completed_successfully
networks:
- es
networks:
es:
volumes:
rustfs-data:repository-s3 は同梱プラグインであり、ネットワークなしでインストールできます。キーストアに入れるのはアクセスキーとシークレットキーだけです。エンドポイントなどの非セキュア設定は elasticsearch.yml に置く必要があります。そうしないとノードは起動を拒否します。
デプロイを開始する
コンテナを起動する前に Compose ファイルを解決します。
docker compose configサービスを起動し、Elasticsearch の起動完了を待ちます。初回起動ではプラグインのインストールとキーストアへの登録が行われ、1〜2 分かかります。
docker compose up -d
curl -s http://localhost:9200スナップショットリポジトリを登録してドキュメントを投入する
RustFS をスナップショットリポジトリとして登録し、インデックスを作成して 5 件のドキュメントを投入します。
curl -s -X PUT "http://localhost:9200/_snapshot/rustfs_repo" \
-H "Content-Type: application/json" \
-d '{"type":"s3","settings":{"bucket":"my-bucket"}}'
curl -s -X PUT "http://localhost:9200/rustfs_index" \
-H "Content-Type: application/json" \
-d '{"mappings":{"properties":{"label":{"type":"keyword"}}}}'
for v in 1 2 3 4 5; do
curl -s -X POST "http://localhost:9200/rustfs_index/_doc" \
-H "Content-Type: application/json" \
-d "{\"label\":\"rustfs-es-doc-$v\",\"value\":$v}" > /dev/null
done
curl -s -X POST "http://localhost:9200/rustfs_index/_refresh" > /dev/null
curl -s "http://localhost:9200/rustfs_index/_count"{"count":5,...}スナップショットを取得する
wait_for_completion を付けてスナップショットを作成し、結果をすぐに確認できるようにします。
curl -s -X PUT "http://localhost:9200/_snapshot/rustfs_repo/snap1?wait_for_completion=true"{"snapshot":{"snapshot":"snap1",...,"indices":["rustfs_index"],"shards":{"total":1,"failed":0,"successful":1}}}RustFS 内のオブジェクトを確認する
バケット初期化用イメージを使ってスナップショットのオブジェクトを一覧します。
docker compose run --rm --entrypoint /bin/sh create-bucket -c \
'/usr/bin/rc alias set rustfs http://rustfs:9000 "$RUSTFS_ACCESS_KEY" "$RUSTFS_SECRET_KEY" >/dev/null && /usr/bin/rc ls rustfs/my-bucket/indices --recursive'スナップショットのメタデータとシャードデータのブロブは、バケット内の indices/ 配下にあります。
[2026-09-21 02:58:01] 3.56 KiB indices/mvyat2-dSEOG3uiCCiFzRA/0/__LbLsSgUUTpqji_EXvqHYCg
[2026-09-21 02:58:01] 3.21 KiB indices/mvyat2-dSEOG3uiCCiFzRA/0/__VIuGNJn3RB-RBWvr4tMn7Q
[2026-09-21 02:58:01] 1.00 KiB indices/mvyat2-dSEOG3uiCCiFzRA/0/index-e9P8q6E9QhitpkiOdgjVDQRustFS Console(管理画面)でこのプレフィックスを参照することもできます。

RustFS からインデックスを復元する
インデックスを削除してから、スナップショットから復元します。
curl -s -X DELETE "http://localhost:9200/rustfs_index" > /dev/null
curl -s -X POST "http://localhost:9200/_snapshot/rustfs_repo/snap1/_restore?wait_for_completion=true" > /dev/null
curl -s "http://localhost:9200/rustfs_index/_count"{"count":5,...}スナップショットのブロブが RustFS から読み戻されるため、ドキュメントが戻ります。
スタックを停止・リセットする
RustFS データボリュームを保持したままコンテナを停止します。
docker compose downスナップショットを削除して空の RustFS ボリュームからやり直す場合は、明示的に --volumes を付けます。
docker compose down --volumesトラブルシューティング
ノードが "non-secure setting ... must be stored inside elasticsearch.yml" で起動を拒否する
キーストアに入れるのは s3.client.default.access_key と s3.client.default.secret_key だけです。エンドポイント、プロトコル、パススタイルアクセス、リージョンは非セキュア設定であり、elasticsearch.yml に定義する必要があります。
復元したシャードや新しいシャードが未割り当てのままになる
ディスク使用率がローウォーターマーク(low watermark、デフォルト 85%)を超えると、Elasticsearch はシャードの割り当てを停止します。ディスクの空きを確保するか、ローカルテストでは次のチェックを無効にします。
curl -s -X PUT "http://localhost:9200/_cluster/settings" \
-H "Content-Type: application/json" \
-d '{"transient":{"cluster.routing.allocation.disk.threshold_enabled":false}}'インデックスが既に存在するため復元に失敗する
以前の失敗した復元でインデックスが残っている場合があります。DELETE /rustfs_index で削除してから、復元を再実行します。
AccessDenied や 403 レスポンス
キーストアの認証情報が RustFS の認証情報と一致しているか、create-bucket サービスが正常に完了しているかを確認します。
docker compose logs create-bucket次のステップ
- 追加の S3 オペレーションを採用する前に、S3 互換性ノートを確認してください。
- アクセスキー管理で本番用の専用認証情報を作成してください。
- Elasticsearch のスナップショットドキュメントに従い、スナップショットライフサイクル管理(SLM)を設定してください。