KV v2は、同じシークレットの複数バージョンを安全に保持できるのが最大の特徴です。現場ではロールバック、監査、変更衝突の抑止(CAS)に直結します。
この記事では、v1との違い、削除/破壊/復活の挙動、メタデータ項目、APIパスの落とし穴までを、試験で問われやすい観点で整理します。
KV v2は、値そのものと独立にメタデータを管理し、書き込み毎にバージョン番号を自動採番します。最新を書き換えても過去版は保持され、復元や比較が可能です。
APIパスはv1と互換ではありません。CLIは抽象化しますが、ポリシーや直叩きのAPIでは data/ と metadata/ の使い分けが必要です。
| 項目 | KV v1 | KV v2 | 試験の観点 |
|---|---|---|---|
| バージョニング | なし | あり(自動採番) | 特定バージョンを参照・復元できるか |
| APIパス | /v1/<mount>/<path> | /v1/<mount>/data|metadata/<path> | ポリシーにも data/ と metadata/ が必要 |
| 削除挙動 | 単純削除 | delete=墓標化, destroy=完全削除 | undelete が可能なのは delete のみ |
| CAS | なし | あり(-cas と metadata.cas_required) | 楽観的同時実行制御の基本 |
| メタデータ設定 | 限定的 | max_versions, cas_required, delete_version_after 等 | 上限超過時の古い版扱いに注意 |
KV v2のリクエスト経路とバージョン保持
Client
| vault kv put/get/delete
v
[Mount: secret (kv-v2)]
|-- /v1/secret/data/<path> # 値とバージョン操作
|-- /v1/secret/metadata/<path> # 属性・上限・削除状態
'-- backend storage (raft/consul)
Versions: 1 -> 2 -> 3 (最新)
delete: tombstone (復活可)
destroy: purge (復活不可)有効化と基本確認
vault secrets enable -path=secret kv-v2
vault kv put secret/app api_key=AAA env=prod # v1 作成
vault kv put secret/app api_key=BBB # v2 作成
vault kv get secret/app # デフォルトは最新(v2)
vault kv get -version=1 secret/app # 過去版を参照CLIでは -version フラグで任意の過去版を参照できます。書き込みは常に新規バージョンを生成し、既存バージョンを上書きはしません。
list は階層のキー一覧を返します(v2でも CLI の list は有効)。API直叩きでは metadata/ パス側での一覧が基本です。
バージョン参照と一覧
# 最新と特定版の取得
vault kv get secret/app
vault kv get -version=1 secret/app
# JSONでバージョン番号だけ取得
vault kv get -format=json secret/app | jq -r '.data.metadata.version'
# 一覧
vault kv list secret/
各バージョンのメタデータには created_time, deletion_time, destroyed, version が含まれます。これにより復元可否や生成時刻をプログラムから判定できます。
メタデータ設定では max_versions(保持上限)、cas_required(CAS必須化)、delete_version_after(論理削除の自動遅延削除タイマー)などを制御できます。未設定時はマウントの既定値に従います。
メタデータ取得/設定(CLIとAPI)
# 単一キーのメタデータ取得
vault kv metadata get secret/app
# メタデータ設定(上限/CAS/遅延削除)
vault kv metadata put -max-versions=20 -cas-required=true -delete-version-after=168h secret/app
# APIでのメタデータ取得と設定
curl -s \
-H "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/secret/metadata/app | jq
curl -s -X POST \
-H "X-Vault-Token: $VAULT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"max_versions":20, "cas_required":true, "delete_version_after":"168h"}' \
$VAULT_ADDR/v1/secret/metadata/app
KV v2の delete は指定バージョンを論理削除(墓標化)します。undelete で復活できます。destroy は指定バージョンのデータを完全に破壊し、復活できません。
キー全体のメタデータ削除(metadata delete)は、すべてのバージョンとメタデータを一括で破壊します。事故時の影響が大きいため権限設計に注意します。
削除と復活のシーケンス
# v2(最新)を確認
vault kv get secret/app
# v1を論理削除(復活可能)
vault kv delete -versions=1 secret/app
vault kv get -version=1 secret/app # 取得不可(tombstone)
vault kv undelete -versions=1 secret/app # 復活
vault kv get -version=1 secret/app # 取得可
# v1を完全破壊(復活不可)
vault kv destroy -versions=1 secret/app
# キー全体を完全削除(全バージョンとメタデータ)
vault kv metadata delete secret/app
CASは、更新時にクライアントが想定する現在バージョンを提示し、一致した場合のみ書き込みを許可する仕組みです。これにより並行更新の取り違えを防げます。
ロールバックは、過去版を読み出し、その内容を新規として再書き込みして新しいバージョンを作るのが基本です(過去版に“戻す”のではなく、“戻した内容で新規版を作る”)。
CAS更新とロールバック例
# 現在バージョンを確認
CURR=$(vault kv get -format=json secret/app | jq -r '.data.metadata.version')
# CASで安全に更新(想定がズレていれば失敗)
vault kv put -cas="$CURR" secret/app api_key=CCC
# v1の内容でロールバック(v3として作成)
OLD=$(vault kv get -format=json -version=1 secret/app | jq -r '.data.data | to_entries | map(\"\(.key)=\(.value)\") | join(" ")')
eval vault kv put secret/app $OLD
v2では data/ と metadata/ の両方に対して適切な権限を付ける必要があります。readとlist、deleteとdestroy/metadata deleteの違いを区別してください。
ストレージ抑制の観点では、max_versions と delete_version_after の併用が有効です。上限超過時の古い版整理により、不要な保持を防げます。
v2を考慮した最小権限ポリシー例
path "secret/data/app" {
capabilities = ["create", "update", "read"]
}
path "secret/metadata/app" {
capabilities = ["read", "list", "update"]
}
# 破壊系は分離ロールで
path "secret/destroy/app" {
capabilities = ["update"]
}
path "secret/metadata/app" {
capabilities = ["delete"] # metadata delete 用(慎重に)
}
Associate
問題 1
KV v2で特定バージョンの値を“将来の復元を可能にしたまま”アクセス不能にしたい。最も適切な操作はどれか?
正解: A
delete は論理削除(tombstone)であり、後から undelete で復活可能。destroy は復元不可、metadata delete はキー全体の完全削除、put -cas は更新操作であり削除ではない。
特定バージョンを完全に消すには?
vault kv destroy -versions=N <mount>/<path> を使用します。delete は論理削除であり、値はストレージに残るため復活可能です。
v2に切り替えたらAPIで404/permission deniedが出るようになった。
ポリシー/リクエストパスが v2向けになっていない可能性があります。読み取りは /v1/<mount>/data/<path>、メタデータや一覧は /v1/<mount>/metadata/<path> を用い、対応する path へ権限を付与してください。
max_versionsを超えた古いバージョンはどうなる?
新規書き込み時に上限を超えた古いバージョンが自動的に整理対象となり、以後は参照・復活できなくなります。保持要件に合わせて上限値を計画してください。
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...