本稿は、HA 構成の Vault を対象に、ダウンタイムを発生させないか、極小化するためのローリングアップグレード手順をまとめます。
特に Integrated Storage(Raft)と Consul ストレージの差分、ヘルスチェックとトラフィック制御、スナップショット取得、リーダーの扱いを重点的に扱います。
基本方針は、パッチバージョンはローリング可能、マイナーバージョンはリリースノートと互換性注意事項に従う、の二点です。複数マイナーをまたぐ一気のアップグレードは避け、段階的に進めます。HA クラスタではフォロワーから順に更新し、リーダーは最後に更新します。
ストレージ別では、Raft はクラスタ内の混在バージョンを短時間許容する前提で設計されていますが、許容範囲はリリースごとに明記されます。Consul ストレージの場合も Vault ノードのローリング更新が基本ですが、Consul 自体の互換性とヘルスにも留意します。プラグイン(Secrets/Auth/Database など)を使っている場合は、対象バージョンの互換性と署名/ABI を事前に確認してください。
| 構成/ストレージ | 推奨手法 | ダウンタイム特性 |
|---|---|---|
| Raft(3台以上の奇数台) | フォロワー→フォロワー→リーダーの順にローリング。必要に応じてリーダーを step-down | 原則ゼロダウン(クォーラム維持が前提) |
| Consul ストレージ(Vault は HA) | Vault ノードをローリング。別途 Consul にてスナップショット・ヘルス監視 | 原則ゼロダウン(LB でドレイン運用前提) |
| 単一ノード(テスト用) | 停止→更新→起動 | 停止時間が発生 |
ローリングアップグレード(LB 配下、Raft 3ノード例)
Clients
|
[ Load Balancer ] (Health: /v1/sys/health)
| | |
[n1]----[n2]----[n3]
| | |
follower follower leader
^ Step1 ^ Step2 ^ Step3(last)
Step1: LB で n1 をドレイン → n1 を更新/再起動 → ヘルスOKで LB 戻し
Step2: 同様に n2 を更新
Step3: leader を step-down → n3 を更新(再選出後に最後更新)前提チェック(互換性・ヘルス・ピア)
# バージョン確認
vault version
# クラスタ状態(リーダー/スタンバイ)
vault status
# ヘルスエンドポイント(LB のチェックに合わせる)
curl -s -o /dev/null -w "%{http_code}\n" http://vault.example.com:8200/v1/sys/health
# 代表的なコード: 200=active、429=standby、503=sealed/uninit
# Raft ピア確認(Integrated Storage の場合)
vault operator raft list-peersアップグレードの安全性は事前準備で決まります。対象バージョンのリリースノート、ストレージの互換性、プラグイン署名/ABI、レプリケーション有無、ヘルスチェック挙動(戻り値/タイムアウト)を確認します。RBAC 変更や TLS 設定変更を伴う場合は必ず別環境で検証し、設定差分を明確化します。
バックアップは、Raft なら Vault のスナップショット、Consul なら Consul のスナップショットを取得します。復元手順(リストア)をドキュメント化し、ロールバック時の意思決定ポイント(どの時点で戻すか)を合意しておきます。
バックアップ取得例
# Raft(Integrated Storage)のスナップショット
env VAULT_TOKEN=... vault operator raft snapshot save /backups/vault-`date +%F-%H%M`.snap
# Consul(Vault が Consul をストレージに使用)
consul snapshot save /backups/consul-`date +%F-%H%M`.snap
# 復元(参考: 事前に単体検証必須)
# vault operator raft snapshot restore /backups/vault-xxxx.snap最小ダウンタイムの鍵は、アップグレード対象ノードを確実にトラフィックから切り離し、復帰時も健全性が確認できるまで受け入れさせないことです。LB のドレインと Vault のヘルス API を組み合わせ、ローリングの各段階でクォーラムと応答性を確認します。
Vault の /v1/sys/health は、一般的に 200(アクティブ)、429(スタンバイ)、503(シールド/未初期化)を返します。LB は 200 のみを通すか、スタンバイを通してもよい設計かを事前に決め、ルールを固定します。
ヘルスチェック例と LB ドレイン(例示)
# ヘルスチェック(LB から)
curl -s -o /dev/null -w "%{http_code}\n" http://n1:8200/v1/sys/health
# 例: HA アクティブのみ通す Nginx 的判定(擬似。実装は環境に合わせる)
# if (status == 200) upstream enable; else disable;
# ドレイン(擬似コマンド。実際は LB ベンダ固有のAPI/CLIを使用)
# lbcli target detach --pool vault --node n1 --drain --timeout 1203台以上(奇数台)でクォーラムを維持しながら、フォロワーから順に更新します。最後にリーダーを step-down して更新し、再選出後の安定性を確認します。Auto Unseal を使用していない場合、再起動後の unseal キー投入手順を事前に準備してください。
バイナリ更新は各ノードで停止→置換→起動の順です。サービス管理は systemd 相当を前提にしていますが、実運用の起動管理に合わせて読み替えてください。
Raft ノードの更新コマンド例(Linux/systemd)
# 1) 対象ノードの切り離し(LB 側)
# lbcli target detach --pool vault --node <node> --drain
# 2) クラスタ状態確認
vault status
vault operator raft list-peers
# 3) サービス停止
sudo systemctl stop vault
# 4) バイナリ置換(検証済みバージョンを配置)
sudo install -m 0755 /tmp/vault-new /usr/local/bin/vault
vault version
# 5) 起動・ヘルス確認
sudo systemctl start vault
sleep 3
vault status
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8200/v1/sys/health
# 6) LB 復帰
# lbcli target attach --pool vault --node <node>
# (リーダー更新時)
# リーダーを明示的に降格してから更新
vault operator step-down
# リーダー再選出後に同様の停止→置換→起動を実施Vault は Consul をストレージとして利用している場合、Vault ノード自体はステートレスに近く、ローリング更新が容易です。ただし Consul の健全性、スナップショット、ネットワーク/TLS 設定には留意します。まず Consul のスナップショット取得とクラスタ状態確認を行い、Vault ノードをフォロワーから順に更新します。
リーダーの扱いは Raft と同様に、最後に更新します。LB ドレインとヘルスチェックでトラフィック影響を抑え、各ノードごとに起動後の到達性とトークン操作を確認します。
Consul ストレージ時の更新例
# 事前に Consul のバックアップ
consul snapshot save /backups/consul-`date +%F-%H%M`.snap
# Vault ノードのローリング(フォロワーから)
# LB ドレイン → 停止 → 置換 → 起動 → ヘルスOK → LB 復帰
sudo systemctl stop vault
sudo install -m 0755 /tmp/vault-new /usr/local/bin/vault
sudo systemctl start vault
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8200/v1/sys/health
# リーダーは最後に
vault operator step-down各ノード更新後に機能検証を行い、最後にクラスター全体のテストを実施します。代表的には、認証(例: approle/login)、シークレット読み書き(KV v2 で put/get)、重要な Transit 暗号化/復号、レプリケーション状態、監査ログ出力の確認です。主要コンシューマのアプリからも 5xx の増加がないかを確認します。
ロールバックは、直前に取得したスナップショットの存在と、旧バイナリの保全を前提に、問題の出たノードを切り離して旧バイナリに戻します。ストレージ破壊的変更がなければ、バイナリ差し戻しのみで復旧できるケースが多いですが、リリースノートでストレージスキーマ変更の有無は必ず確認してください。
代表的な検証コマンド
# レプリケーション状態
vault read -format=json sys/replication/status | jq .
# KV v2 動作確認
env VAULT_TOKEN=... vault kv put secret/app/foo bar=baz
env VAULT_TOKEN=... vault kv get secret/app/foo
# 監査ログの直近イベント確認(出力先に応じて)
sudo tail -n 100 /var/log/vault/audit.logOps
問題 1
3 ノードの Vault(Integrated Storage: Raft、LB 配下)。パッチアップグレードを最小ダウンタイムで行う適切な手順はどれか。
正解: A
HA のローリングアップグレードはクォーラム維持とトラフィック制御が要点。一般にフォロワーから順に更新し、最後にリーダーを step-down して更新する。
Auto Unseal がなくてもローリングアップグレードできますか?
可能です。ただし再起動のたびに各ノードで unseal キーの分割数を満たす投入が必要です。作業計画に unseal 手順と担当者を明記し、投入時間分のヘルス遷移を見込んでください。
バージョンを飛ばして(複数マイナーを跨いで)一気に上げても安全ですか?
推奨されません。原則として段階的に一つずつマイナーバージョンを上げ、各段階でローリングと検証を行ってください。リリースノートに記載の互換性・移行注意に従うのが安全です。
問題発生時のロールバックはどう決めればよいですか?
各ノード更新後の健全性検証が失敗した段階で、当該ノードを LB から切り離し、旧バイナリへ戻します。データ面に懸念があれば、直前のスナップショットから単体環境で復元検証後に本番へ適用します。ストレージスキーマ変更が絡む場合は、事前に戻し方を手順化しておいてください。
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...