運用
監視
Vaultの監視とメトリクス
最終更新: 2026/2/17
監視
Vaultの健全性とパフォーマンスを監視することは、安定した運用に不可欠です。
監視の重要性
適切な監視により、以下を実現できます:
✅ 問題の早期発見
- パフォーマンス低下の検知
- リソース不足の予測
- 異常なアクセスパターンの検出
✅ 可用性の確保
- サービスの稼働状況確認
- フェイルオーバーの検証
- ダウンタイムの最小化
✅ キャパシティプランニング
- リソース使用状況の把握
- スケーリングの判断
- コスト最適化
ヘルスチェック
ヘルスチェックエンドポイント
# 基本的なヘルスチェック
curl https://vault.example.com:8200/v1/sys/health
レスポンス例(正常時):
{
"initialized": true,
"sealed": false,
"standby": false,
"performance_standby": false,
"replication_performance_mode": "disabled",
"replication_dr_mode": "disabled",
"server_time_utc": 1704067200,
"version": "1.15.0",
"cluster_name": "vault-cluster-abc123",
"cluster_id": "12345678-1234-1234-1234-123456789abc"
}
ステータスコード
| コード | 状態 | 説明 |
|---|---|---|
| 200 | 正常 | 初期化済み、アンシール済み、アクティブ |
| 429 | スタンバイ | 初期化済み、アンシール済み、スタンバイ |
| 472 | DR Secondary | DRセカンダリモード |
| 473 | Performance Standby | Performance Standbyモード |
| 501 | 未初期化 | 初期化されていない |
| 503 | シール済み | シールされている |
パラメータ付きヘルスチェック
# スタンバイノードも正常とみなす
curl https://vault.example.com:8200/v1/sys/health?standbyok=true
# 特定のステータスコードを返す
curl https://vault.example.com:8200/v1/sys/health?standbycode=200
# すべてのノードを正常とみなす
curl https://vault.example.com:8200/v1/sys/health?standbyok=true&perfstandbyok=true&sealedcode=200&uninitcode=200
メトリクス
Prometheusメトリクス
設定
config.hcl:
telemetry {
prometheus_retention_time = "30s"
disable_hostname = false
}
メトリクスの取得
# Prometheusメトリクスの取得
curl https://vault.example.com:8200/v1/sys/metrics?format=prometheus
出力例:
# HELP vault_audit_log_request Number of audit log requests
# TYPE vault_audit_log_request counter
vault_audit_log_request 12345
# HELP vault_core_unsealed Vault unsealed status
# TYPE vault_core_unsealed gauge
vault_core_unsealed 1
# HELP vault_runtime_alloc_bytes Number of bytes allocated
# TYPE vault_runtime_alloc_bytes gauge
vault_runtime_alloc_bytes 123456789
主要なメトリクス
システムメトリクス
| メトリクス | 説明 | 推奨閾値 |
|---|---|---|
vault_core_unsealed | アンシール状態(1=アンシール、0=シール) | 1 |
vault_core_active | アクティブ状態(1=アクティブ、0=スタンバイ) | - |
vault_runtime_alloc_bytes | 割り当てられたメモリ | < 80% |
vault_runtime_sys_bytes | システムメモリ | < 80% |
vault_runtime_num_goroutines | Goroutine数 | < 10000 |
リクエストメトリクス
| メトリクス | 説明 | 推奨閾値 |
|---|---|---|
vault_core_handle_request | リクエスト処理時間 | < 1s |
vault_core_handle_request_count | リクエスト数 | - |
vault_audit_log_request | 監査ログリクエスト数 | - |
vault_audit_log_request_failure | 監査ログ失敗数 | 0 |
ストレージメトリクス
| メトリクス | 説明 | 推奨閾値 |
|---|---|---|
vault_raft_apply | Raft適用時間 | < 100ms |
vault_raft_commitTime | Raftコミット時間 | < 50ms |
vault_raft_leader | リーダー状態(1=リーダー) | - |
vault_raft_peers | Raftピア数 | >= 3 |
トークンメトリクス
| メトリクス | 説明 |
|---|---|
vault_token_count | アクティブなトークン数 |
vault_token_create_count | トークン作成数 |
vault_token_lookup_count | トークン参照数 |
Prometheus設定
prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'vault'
metrics_path: '/v1/sys/metrics'
params:
format: ['prometheus']
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token: 'hvs.CAESIJ...'
static_configs:
- targets:
- 'vault-1.example.com:8200'
- 'vault-2.example.com:8200'
- 'vault-3.example.com:8200'
Grafanaダッシュボード
ダッシュボードの例
{
"dashboard": {
"title": "Vault Monitoring",
"panels": [
{
"title": "Vault Status",
"targets": [
{
"expr": "vault_core_unsealed"
}
]
},
{
"title": "Request Rate",
"targets": [
{
"expr": "rate(vault_core_handle_request_count[5m])"
}
]
},
{
"title": "Request Duration",
"targets": [
{
"expr": "vault_core_handle_request"
}
]
},
{
"title": "Memory Usage",
"targets": [
{
"expr": "vault_runtime_alloc_bytes"
}
]
}
]
}
}
推奨ダッシュボード
公式のGrafanaダッシュボード:
ログ監視
ログレベル
# config.hcl
log_level = "info"
ログレベル:
trace: 最も詳細debug: デバッグ情報info: 一般的な情報(推奨)warn: 警告error: エラーのみ
ログの出力先
# config.hcl
log_file = "/var/log/vault/vault.log"
log_rotate_duration = "24h"
log_rotate_max_files = 7
ログの監視
# リアルタイムでログを監視
sudo journalctl -u vault -f
# エラーログのみ表示
sudo journalctl -u vault -p err
# 特定の期間のログ
sudo journalctl -u vault --since "2024-01-15 00:00:00" --until "2024-01-15 23:59:59"
ログ集約
Fluentdの例:
<source>
@type tail
path /var/log/vault/vault.log
pos_file /var/log/td-agent/vault.log.pos
tag vault
<parse>
@type json
</parse>
</source>
<match vault>
@type elasticsearch
host elasticsearch.example.com
port 9200
index_name vault
type_name _doc
</match>
アラート設定
Prometheusアラート
alerts.yml:
groups:
- name: vault
interval: 30s
rules:
# Vaultがシールされている
- alert: VaultSealed
expr: vault_core_unsealed == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Vault is sealed"
description: "Vault instance {{ $labels.instance }} is sealed"
# リーダーが存在しない
- alert: VaultNoLeader
expr: sum(vault_raft_leader) == 0
for: 1m
labels:
severity: critical
annotations:
summary: "No Vault leader"
description: "No Vault leader in the cluster"
# 高いリクエストレイテンシ
- alert: VaultHighLatency
expr: vault_core_handle_request > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "High request latency"
description: "Request latency is {{ $value }}ms"
# メモリ使用率が高い
- alert: VaultHighMemory
expr: vault_runtime_alloc_bytes > 8000000000
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage"
description: "Memory usage is {{ $value }} bytes"
# 監査ログの失敗
- alert: VaultAuditLogFailure
expr: rate(vault_audit_log_request_failure[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Audit log failures"
description: "Audit log failures detected"
Alertmanager設定
alertmanager.yml:
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'vault-team'
receivers:
- name: 'vault-team'
email_configs:
- to: 'vault-team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alertmanager@example.com'
auth_password: 'password'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
channel: '#vault-alerts'
title: 'Vault Alert'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
外部監視
Datadog
# config.hcl
telemetry {
dogstatsd_addr = "localhost:8125"
dogstatsd_tags = ["environment:production", "service:vault"]
}
New Relic
# config.hcl
telemetry {
statsd_address = "localhost:8125"
}
CloudWatch(AWS)
# CloudWatch Agentの設定
{
"metrics": {
"namespace": "Vault",
"metrics_collected": {
"statsd": {
"service_address": ":8125",
"metrics_collection_interval": 60
}
}
}
}
監視のベストプラクティス
1. 多層監視
レイヤー1: ヘルスチェック(稼働状況)
レイヤー2: メトリクス(パフォーマンス)
レイヤー3: ログ(詳細な動作)
レイヤー4: 監査ログ(セキュリティ)
2. アラートの優先順位
| 優先度 | 条件 | 対応時間 |
|---|---|---|
| Critical | サービス停止、データ損失 | 即座 |
| High | パフォーマンス低下、エラー増加 | 1時間以内 |
| Medium | リソース使用率高 | 4時間以内 |
| Low | 情報通知 | 翌営業日 |
3. ダッシュボードの構成
概要ダッシュボード:
- クラスターステータス
- リクエストレート
- エラーレート
- リソース使用率
詳細ダッシュボード:
- 個別ノードのメトリクス
- ストレージパフォーマンス
- 認証メトリクス
- シークレットエンジンメトリクス
4. 定期的なレビュー
# 週次レポートの生成
#!/bin/bash
DATE=$(date +%Y%m%d)
REPORT_FILE="/reports/vault-weekly-$DATE.txt"
echo "Vault Weekly Report - $DATE" > "$REPORT_FILE"
echo "================================" >> "$REPORT_FILE"
# 稼働時間
echo "Uptime:" >> "$REPORT_FILE"
vault status | grep "Cluster Name" >> "$REPORT_FILE"
# リクエスト数
echo "Total Requests:" >> "$REPORT_FILE"
# Prometheusからデータ取得
# エラー数
echo "Total Errors:" >> "$REPORT_FILE"
# ログから集計
# リソース使用率
echo "Resource Usage:" >> "$REPORT_FILE"
# メトリクスから取得
トラブルシューティング
メトリクスが取得できない
確認事項:
# Telemetry設定を確認
vault read sys/config/telemetry
# メトリクスエンドポイントにアクセス
curl -H "X-Vault-Token: $VAULT_TOKEN" \
https://vault.example.com:8200/v1/sys/metrics
アラートが発火しない
確認事項:
# Prometheusのターゲット確認
curl http://prometheus:9090/api/v1/targets
# アラートルールの確認
curl http://prometheus:9090/api/v1/rules
次のステップ
監視を理解したら、次は監査ログでセキュリティ監査の詳細を学びましょう。
継続的な監視監視は一度設定すれば終わりではありません。定期的にメトリクスを確認し、閾値を調整し、新しいアラートを追加してください。