運用

監視

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スタンバイ初期化済み、アンシール済み、スタンバイ
472DR SecondaryDRセカンダリモード
473Performance StandbyPerformance 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_goroutinesGoroutine数< 10000

リクエストメトリクス

メトリクス説明推奨閾値
vault_core_handle_requestリクエスト処理時間< 1s
vault_core_handle_request_countリクエスト数-
vault_audit_log_request監査ログリクエスト数-
vault_audit_log_request_failure監査ログ失敗数0

ストレージメトリクス

メトリクス説明推奨閾値
vault_raft_applyRaft適用時間< 100ms
vault_raft_commitTimeRaftコミット時間< 50ms
vault_raft_leaderリーダー状態(1=リーダー)-
vault_raft_peersRaftピア数>= 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

次のステップ

監視を理解したら、次は監査ログでセキュリティ監査の詳細を学びましょう。

継続的な監視監視は一度設定すれば終わりではありません。定期的にメトリクスを確認し、閾値を調整し、新しいアラートを追加してください。
© 2026 IBM Corporation. Licensed under CC BY 4.0.