概要
HashiCorp VaultのKey/Valueの基本的な使い方を紹介します。
このKey/Valueは少し前にv2
が出ているため、v1
と混同しないよう注意してください。
今回はKey/Valueのバージョン管理が可能なv2
を想定して説明します。
環境
- Vault v0.10.4
- KV Secrets Engine v2
設定
v2でパスkv/
に用意します。
$ vault secrets enable -version=2 kv
ちなみにパスsecret/
はv1のデフォルトになっているため、v2として使いたいときは
$ vault kv enable-versioning secret/
とします。
コマンド(基本)
kv put & kv get
追加コマンドです。
$ vault kv put kv/test hoge=fuga Key Value --- ----- created_time 2018-08-06T22:00:25.880185038Z deletion_time n/a destroyed false version 1
取得はkv get
です。
$ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:00:25.880185038Z deletion_time n/a destroyed false version 1 ==== Data ==== Key Value --- ----- hoge fuga
注意として宣言的なコマンドなため、別フィールドをputしようとすると前のフィールドが消えます。
$ vault kv put kv/test piyo=dazo Key Value --- ----- created_time 2018-08-06T22:04:54.411033075Z deletion_time n/a destroyed false version 2
もう一度取得してみましょう
$ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:04:54.411033075Z deletion_time n/a destroyed false version 2 ==== Data ==== Key Value --- ----- piyo dazo
前のキーhoge
が消えています。
kv patch
上書きが嫌な場合はこのkv patch
コマンドを使います。
$ vault kv patch kv/test piyo2=dazo2 Key Value --- ----- created_time 2018-08-06T22:05:53.719345063Z deletion_time n/a destroyed false version 3 $ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:05:53.719345063Z deletion_time n/a destroyed false version 3 ==== Data ==== Key Value --- ----- piyo dazo piyo2 dazo2
前のキーを残したまま保存できました。
まだドキュメントには明記されてないですが以下のプルリクでマージされてます。
kv delete
deleteをすると論理削除が行われます。
$ vault kv delete kv/test Success! Data deleted (if it existed) at: kv/test
取得しても返ってきません。
$ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:05:53.719345063Z deletion_time 2018-08-06T22:09:28.872598368Z destroyed false version 3
v2はバージョン管理されてますが、deleteしたから自動で古いバージョンが返るようになるかというと、そうではありませんので注意してください。
コマンド(応用)
kv get -version=n
KVのv2ではバージョン管理が行えるため、古いバージョンの値を取得することが可能です。
$ vault kv get -version=1 kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:00:25.880185038Z deletion_time n/a destroyed false version 1 ==== Data ==== Key Value --- ----- hoge fuga
kv undelete
delete
は論理削除と言いました。なので戻すことも可能です。
$ vault kv undelete -versions=3 kv/test Success! Data written to: kv/undelete/test $ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:05:53.719345063Z deletion_time n/a destroyed false version 3 ==== Data ==== Key Value --- ----- piyo dazo piyo2 dazo2
kv destroy
delete
は論理削除と言いましたが、destroy
は完全に削除します。
$ vault kv destroy -versions=2 kv/test Success! Data written to: kv/destroy/test $ vault kv get -version=2 kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:04:54.411033075Z deletion_time n/a destroyed true version 2
undelete
しても戻りません。
$ vault kv undelete -versions=2 kv/test Success! Data written to: kv/undelete/test $ vault kv get -version=2 kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:04:54.411033075Z deletion_time n/a destroyed true version 2
destroy
も自動で古いバージョンが返ってくるわけじゃないので注意してください。単に空のレスポンスです。
kv rollback
まだドキュメントには書かれてませんが、以下のプルリクでrollbackができるようになってます。
間違ってkv patch
してしまっても特定のフィールドを消せず不便に感じていましたが、このrollback
によって前のバージョンの状態に戻すことが容易になったので問題が解消されました。
$ vault kv rollback -version=1 kv/test Key Value --- ----- created_time 2018-08-06T22:15:58.888084232Z deletion_time n/a destroyed false version 4 $ vault kv get kv/test ====== Metadata ====== Key Value --- ----- created_time 2018-08-06T22:15:58.888084232Z deletion_time n/a destroyed false version 4 ==== Data ==== Key Value --- ----- hoge fuga
のように使います。
ロールバックしたKey/Valueは新しいバージョンとして保存されます。
kv metadata
バージョンをいくつまで保持するか、といった設定も可能です。
現状は上限がないため4つ保持していますが、
$ vault kv metadata get kv/test ======= Metadata ======= Key Value --- ----- cas_required false created_time 2018-08-06T22:00:25.880185038Z current_version 4 max_versions 0 oldest_version 0 updated_time 2018-08-06T22:15:58.888084232Z ====== Version 1 ====== Key Value --- ----- created_time 2018-08-06T22:00:25.880185038Z deletion_time n/a destroyed false ====== Version 2 ====== Key Value --- ----- created_time 2018-08-06T22:04:54.411033075Z deletion_time n/a destroyed true ====== Version 3 ====== Key Value --- ----- created_time 2018-08-06T22:05:53.719345063Z deletion_time n/a destroyed false ====== Version 4 ====== Key Value --- ----- created_time 2018-08-06T22:15:58.888084232Z deletion_time n/a destroyed false
ここで1つしか保持しないとします
$ vault kv metadata put -max-versions 1 kv/test Success! Data written to: kv/metadata/test
この時点ではまだ古いデータも取得可能ですが、新しいデータを入れると
$ vault kv put kv/test meta=test Key Value --- ----- created_time 2018-08-06T22:17:55.618939739Z deletion_time n/a destroyed false version 5 $ vault kv metadata get kv/test ======= Metadata ======= Key Value --- ----- cas_required false created_time 2018-08-06T22:00:25.880185038Z current_version 5 max_versions 1 oldest_version 5 updated_time 2018-08-06T22:17:55.618939739Z ====== Version 5 ====== Key Value --- ----- created_time 2018-08-06T22:17:55.618939739Z deletion_time n/a destroyed false
このようにmetadataも1つしか出なくなり、kv getしても
$ vault kv get -version=1 kv/test No value found at kv/data/test
古いデータは取得できなくなります。