Vault Agent の template 機能は、Vault 上のシークレットをポーリングや更新イベントに応じてファイルとして安全に出力し、アプリのリロード等を自動化できます。
本稿では、運用でつまずきやすいファイル原子書き込み、権限設定、リロードのトリガー設計を、試験対策と実務の両面から整理します。
Vault Agent は Vault への認証を自動化し、取得したトークンを用いてシークレットをキャッシュ・更新し続ける常駐プロセスです。template スタンザを用いると、取得したデータを Go テンプレート構文(consul-template 互換の関数群)で整形し、ファイルに出力できます。
Auto-auth(例: AppRole, Kubernetes など)で得たトークンは自動的にローテーションされ、対象シークレットの更新・期限切れに合わせてテンプレート出力も再実行されます。結果として、アプリケーションはファイルを読むだけで最新のクレデンシャルを受け取れます。
Vault Agent のテンプレート出力は、一時ファイルに書いた後にリネームする原子的な手順で行われます。これにより、読み手(アプリケーション)が中途半端な内容を読むことを防げます。
また、perms(例: 0640)で最小権限を明示し、create_dest_dirs=true でディレクトリが未作成でも安全に配置できるようにします。アプリは destination のファイルを読むだけにし、書き込みは Agent のみに限定するのが基本方針です。
| 手段 | 主な用途 | 更新トリガ | 原子書き込み |
|---|---|---|---|
| template 出力 | 設定やクレデンシャルをファイル化 | シークレット更新・TTL・ポーリング | あり(tmp + rename) |
| auto_auth のファイルシンク | アプリに Vault トークンを渡す | トークン更新 | あり(実装依存でファイル更新) |
| アプリが直接 API 呼び出し | オンデマンドで都度取得 | アプリ実装に依存 | なし(アプリ内で管理) |
全体フロー(ファイル出力とプロセス連携)
テンプレート出力後にアプリへ変更を伝える方法は、service manager 経由の reload、SIGHUP 送信、ソケット通知などが代表的です。Vault Agent の template スタンザに command を設定すると、再レンダリング直後にそのコマンドが呼ばれます。
証明書やクレデンシャルをローテーションする場合、アプリ側がホットリロード対応かを事前に確認し、非対応なら短いダウンタイムでの再起動戦略を設計します。
以下は、データベース動的クレデンシャル(database/creds/readonly)をファイルに出力し、アプリサービスをリロードする例です。ポイントは、with secret ブロックで単一リクエストにまとめ、ユーザ名とパスワードの不整合を防ぐこと、そして perms の最小化と原子的な出力です。
サービス側は db.env を環境ファイルとして読み込み、reload で再読込する前提です。
agent.hcl(抜粋: auto_auth と template)
cache {
use_auto_auth_token = true
}
auto_auth {
method "approle" {
mount_path = "auth/approle"
config = {
role_id_file_path = "/etc/vault/role_id"
secret_id_file_path = "/etc/vault/secret_id"
}
}
sink "file" {
config = {
path = "/run/vault/agent.token"
}
}
}
template {
destination = "/etc/myapp/db.env"
perms = 0640
create_dest_dirs = true
contents = <<EOH
{{- with secret "database/creds/readonly" -}}
DB_USER={{ .Data.username }}
DB_PASS={{ .Data.password }}
DB_HOST=db.internal.example
DB_NAME=app
{{- end -}}
EOH
command = ["/bin/systemctl", "reload", "myapp.service"]
}
リロードの多重起動を防ぐため、テンプレート更新頻度(ポーリング間隔や TTL)とアプリのリロード時間を見積もり、必要に応じてコマンド側でデバウンスやロックを入れます。大規模環境では、更新嵐が起きないようロール毎に TTL を分散させるのが有効です。
権限面では、テンプレート出力先ディレクトリの所有権と perms を厳格にし、バックアップや一時ファイルが残置しないかを監視します。ログレベルは平時は info、トラブル時のみ debug を推奨します。
Vault Agent の template は原子的ファイル書き込みであること、command で外部プロセスを連携できること、auto_auth によりトークンの自動取得・ローテーションが行われることを押さえてください。
KV v2 ではデータパスとメタデータパスの違い、動的シークレットは TTL に基づいて更新・再レンダリングされる点も頻出です。
Associate / Ops
問題 1
運用チームはアプリのダウンタイムを避けつつ、動的に更新される DB 認証情報を安全に反映したい。最も適切なアプローチはどれか。
正解: A
テンプレートの原子的書き込みと command によるリロードを組み合わせると、整合性と可用性を両立できる。起動時のみ取得や無制御な再起動、トークンの標準出力渡しはセキュリティと運用性の面で不適切。
テンプレートの command が失敗した場合、ファイル出力はロールバックされますか?
いいえ。テンプレートの書き込みと command 実行は別フェーズです。出力は完了し、command が失敗するとログに記録されます。監視と再試行(例: systemd の ExecReload 再試行や外部ヘルスチェック)を設計してください。
同一テンプレート内で同じシークレットを複数回参照しても大丈夫ですか?
with secret ブロックで一度だけ取得し、そのブロック内のフィールドを参照してください。複数回の secret 呼び出しは動的シークレットの不整合(ユーザとパスワードの組がずれる等)を招く恐れがあります。
ファイルの所有者やグループをテンプレート側で直接指定できますか?
テンプレートでは perms(パーミッション)と create_dest_dirs が主に利用されます。所有者やグループの調整が必要な場合は、サービスの実行ユーザに合わせたディレクトリ所有権の事前設定や、command での調整を検討してください。
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...