本稿は、Vault の Integrated Storage(Raft)を前提に、クラスタへのノード追加と削除に焦点を当てます。奇数台構成の維持、過半数の確保、TLS/アドレス設計、そして計画停止・障害時の除去パターンを実務寄りに解説します。
試験対策としては、コマンドの適用対象(リーダー/任意ノード)、過半数の計算、join/remove の要件、そして autopilot の役割を把握しておくと得点に直結します。公式ドキュメントの用語・動作に沿って説明します。
Vault の Integrated Storage は Raft でレプリケーションとリーダー選出を行います。投票権を持つノードの過半数が到達可能であることが可用性の鍵です。推奨は 3 台または 5 台の奇数構成で、メンバーの増減時も常に過半数を割らない計画が必要です。
各ノードはローカルディスク上の raft データディレクトリを持ち、TLS を前提とした API 用ポート(既定 8200)とクラスタ内部通信用ポート(既定 8201)を使います。api_addr と cluster_addr は正しい FQDN/SAN で設定し、相互に名前解決・疎通できることがノード追加の前提です。
最小限の Vault サーバ設定例(新規ノード用)
storage "raft" {
path = "/opt/vault/data" # 空ディレクトリを指定
node_id = "vault-3" # 各ノードで一意
}
cluster_name = "vault-prod"
api_addr = "https://vault-3.example.com:8200"
cluster_addr = "https://vault-3.example.com:8201"
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/etc/vault.d/certs/vault.crt"
tls_key_file = "/etc/vault.d/certs/vault.key"
}
tls_disable = 0運用中クラスタへ新しいノードを追加する典型手順です。既存クラスタの可用性を維持したまま拡張できます。追加対象ノードは起動前に設定・証明書・ポート疎通を満たしている必要があります。
join は新ノード側から実行します。コマンドは自身が参照する VAULT_ADDR を新ノードの API に、引数には既存クラスタのリーダー(または到達可能なメンバー)の API アドレスを指定します。
| 追加・展開手段 | 主目的/ユースケース | ダウンタイム影響 | 主要コマンド/操作 |
|---|---|---|---|
| オンライン join(同一クラスタに台数追加) | スケールアウト、奇数台維持 | なし(過半数が維持される限り) | vault operator raft join、list-peers で検証 |
| 故障ノードの置換(同数維持) | 恒久障害の置換・健全化 | なし(先に remove-peer、その後 join) | list-peers で peer_id 確認 → remove-peer → 新ノードで join |
| スナップショットから新クラスタ再構築 | 大規模移設・災害復旧(別環境) | 切替点で計画停止が必要 | vault operator raft snapshot save/restore(別クラスタとして構築) |
ノード追加の流れ(イメージ)
Before (3 nodes):
[vault-1] (Leader) ---- [vault-2] (Follower)
\
\---------------- [vault-3] (Follower)
Add vault-4:
New Node: [vault-4]
- start w/ empty raft dir
- api_addr/cluster_addr set
- join -> https://vault-1:8200
After (4 nodes,推奨は最終的に5台へ):
[vault-1] (Leader) ---- [vault-2]
\
\---- [vault-3] ---- [vault-4]
ノード追加の実行コマンド例
# 新ノード側で(自身の Vault API に対して操作)
export VAULT_ADDR="https://vault-4.example.com:8200"
export VAULT_CACERT="/etc/vault.d/certs/ca.crt"
# 既存クラスタの API アドレスを指定して join
vault operator raft join https://vault-1.example.com:8200
# 既存クラスタの任意ノードからピア確認
export VAULT_ADDR="https://vault-1.example.com:8200"
vault operator raft list-peers削除は必ず過半数を維持できる構成で実施します。5 台構成で 1 台を外す場合は 4 台になり、過半数は 3 です。次の作業で 2 台を同時に停止しないように計画します。
計画停止(ノード健全)の場合は、対象がリーダーであれば step-down を先に実行し、その後 remove-peer でクラスタメンバーシップから外します。恒久故障などでノードが帰ってこない場合も、peer_id を指定して remove-peer します。
安全な削除手順(計画停止/故障時)
# 1) ピア確認(任意ノードで)
export VAULT_ADDR="https://vault-1.example.com:8200"
vault operator raft list-peers
# 出力の Node ID から対象の PEER_ID を特定
# 2) 対象がリーダーなら一旦降格
vault operator step-down
# 3) メンバーシップから除去
vault operator raft remove-peer -peer-id=<PEER_ID>
# 4) 対象ノード側のサービス停止とデータ処理
# systemctl stop vault
# rm -rf /opt/vault/data # 再利用しない場合のみ(慎重に)Raft は投票権ノードの過半数が生存していなければ書き込み不可になります。追加や削除、ローリングアップグレードでは、常に『次の瞬間に残る台数』で過半数が成り立つかを確認してください。
同時に 2 台以上を止めない、障害発生時は計画作業を凍結し、まずはクラスタの安定化を優先する、といった基本原則を運用 Runbook に明文化しておくと事故を防げます。
健全性のクイックチェック
export VAULT_ADDR="https://vault-1.example.com:8200"
# ピア情報
vault operator raft list-peers
# Autopilot の健全性(ラグや候補性)
vault operator raft autopilot statejoin 失敗の多くは TLS/SAN とアドレス設定の不整合です。api_addr はクライアント/CLI が到達する URL、cluster_addr はノード間レプリケーション(ポート 8201)で使われる URL です。証明書の SAN に両者のホスト名(もしくはワイルドカード/SubjectAltName)が含まれているか確認してください。
もう一つの典型は、既にデータが入った raft ディレクトリで join しようとして失敗するケースです。新規参加ノードの raft データディレクトリは空である必要があります。
TLS/SAN と疎通の事前チェック例
# SAN の確認(証明書の拡張に api_addr/cluster_addr のホストが含まれるか)
openssl x509 -in /etc/vault.d/certs/vault.crt -noout -text | grep -A1 "Subject Alternative Name"
# API/クラスタ疎通
curl --cacert /etc/vault.d/certs/ca.crt https://vault-1.example.com:8200/v1/sys/health
curl --cacert /etc/vault.d/certs/ca.crt https://vault-1.example.com:8201/raft/configuration || true # 8201 は証明に失敗しても到達性を把握ローリングアップグレードや OS パッチ適用時は、対象がリーダーであれば step-down → 停止 → 起動 → 健全性確認、を 1 台ずつ進めます。毎回 list-peers/autopilot state を取り、過半数を割らない計画を守ります。
Autopilot はクラスタの健全性監視や不要サーバのクリーンアップに役立ちます。運用では『状態の可視化(state)』をまず活用し、必要に応じて設定変更(set-config)は段階的に検証してから本番に適用しましょう。
ローリング作業の定型シェル(抜粋)
# 対象ホストがリーダーなら降格
vault operator step-down || true
# 健全性確認
vault operator raft list-peers
vault operator raft autopilot state
# ここで OS/バイナリ更新 → 再起動
# 再度健全性確認して次のノードへOps
問題 1
Vault の Raft クラスタ(5 ノード構成)で、1 台が恒久故障し復旧見込みがありません。可用性を損なわずに除去して健全な状態に戻す最も適切な手順はどれですか?
正解: A
故障ノードが戻らない場合は remove-peer でクラスタメンバーシップから正式に除去し、クラスタを健全に保ってから代替ノードを join します。過半数は 3/5 なので作業中も可用性を維持可能です。先に join して 6 台にする手順は過半数の観点では問題ないこともありますが、メンバーシップと運用管理の一貫性のため、不要ノードを除去してから置換するのが推奨です。他の選択肢は自動再参加の誤解や不要な全停止を含み不適切です。
remove-peer はどのノードで実行すべきですか?リーダーだけが実行可能ですか?
通常は任意の到達可能なノードで実行すれば内部的にリーダーへフォワードされます。実施前に vault operator raft list-peers で対象の peer_id を確認してください。
join 時に必要なアドレスは api_addr と cluster_addr のどちらですか?
join コマンドには既存クラスタの API アドレス(https://<host>:8200)を指定します。クラスタ内部のレプリケーションは各ノードの cluster_addr(通常 8201)で行われるため、証明書と疎通が正しく設定されていることが前提です。
偶数台(4 台や 6 台)構成は避けるべきですか?
Raft の特性上、投票ノードは奇数台が望ましいです。偶数台でも動作しますが、同時障害に対する耐性や計画停止の柔軟性で不利です。運用では 3 台または 5 台を基本とし、増設時は最終的に奇数へ落とし込む計画を推奨します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Vault のコア概念を最短距離で理解する:Secret / Auth / Policy / Token
HashiCorp Vault Associate レベルで押さえるべきコア概念(Secret Engine、Auth ...
Vault Operations Professional: 上位資格としての範囲を実務目線で押さえる
HashiCorp Vault Operations Professional(Ops Pro)の出題範囲を、Assoc...
Vaultにおけるパスベースのルーティング: マウントとAPI構造を読み解く
HashiCorp Vaultのパスベースのルーティングを、マウント設計とAPIパスの観点から整理。Associateレ...
Vault Tokens の基礎: 認証の起点となる概念
HashiCorp Vault におけるトークンの役割、種類、ライフサイクル、ポリシー連携、設計パターンをAssocia...
Vault のトークン種類を正しく使い分ける: service / batch 実践
HashiCorp Vault Associate 向けの試験対策と実務運用を両立させた、service トークンと b...