Vault の HA クラスタでは、スタンバイノードがクライアントからのリクエストをアクティブノードへ内部転送する Request Forwarding が既定で機能します。これにより、クライアントやロードバランサがリーダーを意識せずに運用できます。
本稿では、安定機能と公式ドキュメントに基づく実装要点を、試験対策(Ops)に通用する観点でまとめます。バージョン依存の挙動は避け、HA 前提の基本を押さえます。
Request Forwarding は、スタンバイノードが受けた API リクエストをクラスタ内のアクティブノードへ内部転送する仕組みです。従来の 307 リダイレクトと異なり、クライアントはリーダーの場所を意識せず、任意ノードに送るだけで処理されます。
前提はシンプルです。HA 対応ストレージ(Raft 統合ストレージまたは Consul)を使用し、各ノードで api_addr と cluster_addr を正しく設定し、TLS を有効にします。これらが満たされると、スタンバイは自動的に転送を行います。
最小構成例(server.hcl 抜粋: Raft+TLS)
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/opt/vault/tls/server.crt"
tls_key_file = "/opt/vault/tls/server.key"
}
# クライアントが到達する FQDN/ポート
api_addr = "https://vault-1.example.com:8200"
# ノード間通信用アドレス(通常 8201)
cluster_addr = "https://vault-1.example.com:8201"
storage "raft" {
path = "/opt/vault/data"
retry_join {
leader_api_addr = "https://vault-1.example.com:8200"
}
}
tls_disable = 0クライアントは LB または直接任意のノードに接続します。スタンバイが受けたリクエストは cluster_addr を用いたノード間 TLS でアクティブに転送され、レスポンスはスタンバイ経由でクライアントへ返ります。追加ホップは生じますが、クライアント実装は単純化されます。
フォワーディングは API の種類を意識せず動作します(書き込み系も転送対象)。ただし、アクティブ不在やノード間通信断では転送失敗となるため、健全性監視とネットワーク疎通の確保が重要です。
Request Forwarding の全体フロー
フロー確認(どのノードに当たってもリーダーが応答)
# 任意ノード経由でリーダー情報を取得
$ curl -sS https://vault.any.example.com:8200/v1/sys/leader -k
{"ha_enabled":true,"is_self":false,"leader_address":"https://vault-1.example.com:8200"}
# スタンバイに当たっても転送され、アクティブが処理する実務では L4(TCP)LB を推奨します。HTTP レイヤでの書き換えやヘッダ付与は避け、長時間のリクエスト(ワッチ系)に備えてアイドルタイムアウトを十分に確保します。スティッキーは不要です。
ヘルスチェックは /v1/sys/health を使用します。待機系も可とするかは運用方針次第ですが、Request Forwarding を活かすなら standbyok=true を使い、全ノードを配下に入れる設計が扱いやすくなります。
| モード | クライアント要件 | 遅延・スループット傾向 | 運用の要点 |
|---|---|---|---|
| リダイレクト(307) | リダイレクト追従が必要 | 低〜中(リーダーへ直接到達) | クライアントがリーダーを理解。LB 設計は容易 |
| Request Forwarding | 特別要件なし(任意ノードへ送信) | 中(スタンバイ経由で 1 ホップ増) | api_addr/cluster_addr と TLS を厳密設定 |
| Performance Standby | 特別要件なし | 読み取りは低遅延(スタンバイ処理可) | 対象パスのキャッシュ性に依存。書き込みは転送 |
HAProxy の最小例(L4/TCP、ヘルスチェック付き)
frontend vault_in
bind *:8200
default_backend vault_nodes
backend vault_nodes
option tcp-check
# 健全性: スタンバイも可(要件に応じて変更)
tcp-check connect
tcp-check send GET\ /v1/sys/health?standbyok=true\ HTTP/1.1\r\nHost:\ vault\r\n\r\n
tcp-check expect rstring "(200|429)"
server vault1 10.0.0.11:8200 check
server vault2 10.0.0.12:8200 check
server vault3 10.0.0.13:8200 checkまずはノード間疎通(cluster_addr)とリーダー選出を確認します。次に任意ノード経由でシークレット読み書きが成功するかを確認し、ログに転送エラーが出ていないか点検します。
失敗しやすいのは証明書 SAN 不備、cluster_addr の名前解決不一致、LB のアイドルタイムアウト過小、ノード間 TCP ブロック(セキュリティグループやファイアウォール)です。
よく使う確認コマンド
# リーダー確認(任意ノードで可)
$ curl -sS https://vault-2.example.com:8200/v1/sys/leader -k | jq .
# スタンバイ許容の健全性(LB 用)
$ curl -sS "https://vault-2.example.com:8200/v1/sys/health?standbyok=true" -k
# Raft ピア確認(統合ストレージ時)
$ vault operator raft list-peers
# ノード間ポート疎通(cluster_addr 側)
$ nc -vz vault-1.example.com 8201アクティブがダウンすると、ストレージのリーダー選出により新しいアクティブが昇格します。Request Forwarding は新アクティブに追随します。昇格完了前は転送できないため、クライアントは再試行戦略を持たせるのが安全です。
ネットワーク分断では、スタンバイ→アクティブのノード間 TLS が成立しない側では転送エラーになります。LB を複数 AZ/ゾーンで構成し、任意ノードへの接続と再試行で影響を抑えます。
障害シナリオの簡易検証
# 例: 旧アクティブを停止して挙動を見る(検証環境でのみ)
# active ノード
$ sudo systemctl stop vault
# 別ノードから連続でヘルスチェック
$ watch -n 1 'curl -sS https://vault.any.example.com:8200/v1/sys/health -k | jq .'
# 数秒〜十数秒で新アクティブが反映され、転送が再開することを確認Request Forwarding では、スタンバイからアクティブへの転送経路も TLS で保護されます。ノード間通信用の証明書は api_addr/cluster_addr 双方の SAN を満たすように管理し、証明書更新時は順次ローリングで入れ替えます。
監査ログは最終的にリクエストを処理したノードで確実に記録されます。よって、アクティブ側での監査デバイス設定が中核です。スタンバイ側での監査は転送メタ情報に留まる場合があるため、監査要件はアクティブ側で満たす設計が安全です。
最低限の監査・通信制御例
# 監査デバイスの有効化(アクティブで実施、永続化先は運用方針に合わせる)
$ vault audit enable file file_path=/var/log/vault_audit.log
# 例: セキュリティグループ/ファイアウォールの許可(概念)
# API: 8200/TCP クライアント -> すべての Vault ノード
# Cluster:8201/TCP 各 Vault ノード間(双方向)Ops
問題 1
Vault を 3 ノードの HA クラスタ(Raft)で運用し、前段に TCP ロードバランサを置きました。Request Forwarding を有効に活かすために最低限必要な設定の組み合わせはどれですか?
正解: A
Request Forwarding は api_addr/cluster_addr と TLS が正しく設定された HA 構成で自動動作します。LB は任意ノードに振り分けられればよく、スタンバイ許容のヘルスチェックで全ノードを配下に入れ、スティッキーは不要です。B と C は要件に反し、D は可用性を損ねます。
Performance Standby と Request Forwarding の関係は?
Performance Standby は一部の読み取りをスタンバイ側で処理して遅延を下げる機能で、処理できないリクエストは Request Forwarding によりアクティブへ転送されます。両者は併用され、読み取り中心のワークロードで効果があります。
Request Forwarding を使うと監査ログはどこに出力されますか?
最終的にリクエストを処理したノード(通常はアクティブ)で確実に記録されます。監査要件はアクティブ側の監査デバイス設定で満たす設計にしてください。
無効化したい場合はどうすればよいですか?
クラスタ内ルーティングの前提(特に cluster_addr)を満たさずに構成した場合、スタンバイは 307 リダイレクトを返す挙動になります。ネットワークやポリシー上の理由で転送を避けたい場合は、リダイレクト前提の設計とクライアント実装を採用してください。
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...