Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

運用ランブック

このページでは、EdgeSentry-RS の本番環境デプロイにおけるオブザーバビリティの設定、アラート閾値、バックアップ・リストア手順を説明します。


オブザーバビリティ

tracing を使った構造化ログ

EdgeSentry-RS は tracing ファサードを使用しています。サブスクライバーはバンドルされていません。デプロイ側がアプリケーション起動時に任意のバックエンドを接続します。サブスクライバーが登録されていない場合、ライブラリのオーバーヘッドはゼロです。

本番環境向け推奨サブスクライバー(JSON を stdout に出力し、Loki / CloudWatch に取り込む):

# ホストアプリケーションの Cargo.toml
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
use tracing_subscriber::{fmt, EnvFilter};

fn main() {
    fmt()
        .json()
        .with_env_filter(EnvFilter::from_default_env()) // RUST_LOG=edgesentry_rs=info
        .init();
    // ...
}

本番環境では RUST_LOG=edgesentry_rs=info、インシデント調査時は edgesentry_rs=debug を設定してください。

ライブラリが出力する構造化ログイベント

すべてのイベントにはモジュールパスが target として含まれます。主要なイベントの一覧:

レベルターゲットイベント主要フィールド
DEBUGedgesentry_rs::agentsigning recorddevice_id, sequence, payload_bytes
DEBUGedgesentry_rs::ingest::storageingest starteddevice_id, sequence, object_ref, payload_bytes
WARNedgesentry_rs::ingest::storagepayload hash mismatch — record rejecteddevice_id, sequence
WARNedgesentry_rs::ingest::storageintegrity policy rejected recorddevice_id, sequence, reason
ERRORedgesentry_rs::ingest::storageraw data store write faileddevice_id, sequence, error
ERRORedgesentry_rs::ingest::storageaudit ledger append faileddevice_id, sequence, error
ERRORedgesentry_rs::ingest::storageoperation log write faileddevice_id, sequence, error
INFOedgesentry_rs::ingest::storagerecord accepteddevice_id, sequence, object_ref
DEBUGedgesentry_rs::ingest::verifysignature verification faileddevice_id, sequence
DEBUGedgesentry_rs::ingest::verifyduplicate record rejecteddevice_id, sequence
DEBUGedgesentry_rs::ingest::verifysequence out of orderdevice_id, expected, actual
DEBUGedgesentry_rs::ingest::verifyprev_record_hash mismatch — chain brokendevice_id, sequence
DEBUGedgesentry_rs::ingest::verifyrecord verified and accepteddevice_id, sequence

推奨 Prometheus メトリクス(ログから導出)

ログ→メトリクスパイプライン(Promtail + Loki、または Vector など)を使い、構造化ログイベントからカウンターを導出します:

メトリクス導出方法アラート閾値
edgesentry_ingest_accepted_totalINFO "record accepted" イベントをカウント
edgesentry_ingest_rejected_total{reason}WARN 拒否イベントを reason フィールドでラベル付けしてカウント10件/分を継続 → P1 アラート
edgesentry_ingest_error_total{component}ERROR ストレージ障害イベントをコンポーネント別にカウント1件でも発生 → P0 アラート
edgesentry_chain_break_totalDEBUG "prev_record_hash mismatch" イベントをカウント1件でも発生 → P0 アラート
edgesentry_signature_fail_totalDEBUG "signature verification failed" イベントをカウント5件/分を継続 → P1 アラート

OpenTelemetry(トレーシングスパン)

IngestService::ingest メソッドは tracing スパンを出力します。OTLP エクスポーターに接続することで分散トレーシングが利用できます:

opentelemetry = "0.26"
opentelemetry-otlp = { version = "0.26", features = ["grpc-tonic"] }
tracing-opentelemetry = "0.27"

アラート定義

アラート条件重要度対応
IngestStorageErrorERROR レベルのストレージ障害が発生P0DB/S3 接続を確認し、ディスクと認証情報を検証する
ChainBreakprev_record_hash mismatch イベントが発生P0改ざんまたはリプレイを調査し、再起動前にログを保全する
HighRejectionRate拒否率が 5 分間 10件/分を超過P1デバイスファームウェアを確認し、署名鍵のローテーション設定を調査する
SignatureFailureSurge署名失敗が 5 分間 5件/分を超過P1鍵の漏洩またはアクティブなスプーフィングの可能性を調査する
AuditLedgerLagPostgres operation_logs 挿入レイテンシの p99 が 2 秒超P1DBのクエリプランと autovacuum の競合を確認する

復旧目標

目標ターゲット根拠
RTO(復旧時間目標)30 分以内pg_basebackup + WAL リプレイによるリストア時間
RPO(復旧時点目標)5 分以内5 分間隔の継続的 WAL アーカイブ

バックアップ手順

PostgreSQL — 監査台帳・操作ログ

前提条件: WAL アーカイブが有効化されていること(archive_mode = onarchive_command で S3 等に転送)。

1. ベースバックアップの取得

pg_basebackup \
  --host=<DB_HOST> \
  --username=<DB_USER> \
  --pgdata=/backup/pg_base_$(date +%Y%m%d_%H%M%S) \
  --format=tar \
  --gzip \
  --wal-method=stream \
  --checkpoint=fast \
  --progress

2. バックアップの検証

pg_restore --list /backup/pg_base_<timestamp>/base.tar.gz | head -20

3. WAL の継続アーカイブ

postgresql.confarchive_command が WAL セグメントを耐久性のあるストレージ(例:S3)に転送していることを確認します:

archive_command = 'aws s3 cp %p s3://<BUCKET>/wal/%f'

4. 保持ポリシー

バックアップ種別保持期間
ベースバックアップ30 日
WAL アーカイブ30 日
論理ダンプ(pg_dump7 日(週次)

S3 / MinIO — ペイロード生データストア

バケットでバージョニングクロスリージョンレプリケーションを有効化します:

# バージョニングの有効化
aws s3api put-bucket-versioning \
  --bucket <BUCKET> \
  --versioning-configuration Status=Enabled

# レプリケーションの有効化(宛先バケットと IAM ロールを別途設定した上で)
aws s3api put-bucket-replication \
  --bucket <BUCKET> \
  --replication-configuration file://replication.json

最低限のレプリケーション先:別リージョン 1 か所。CLS Level 3 のエビデンス完全性を確保するため、オブジェクトロックまたはバージョニングを有効化し、ペイロードが上書き削除されないようにします。


リストア手順

PostgreSQL — ポイントインタイムリカバリ(PITR)

# 1. Postgres サービスを停止
systemctl stop postgresql

# 2. ベースバックアップを展開
tar -xzf /backup/pg_base_<timestamp>/base.tar.gz -C /var/lib/postgresql/data/

# 3. リカバリ設定を作成
cat > /var/lib/postgresql/data/recovery.conf <<EOF
restore_command = 'aws s3 cp s3://<BUCKET>/wal/%f %p'
recovery_target_time = '<TARGET_TIMESTAMP>'
recovery_target_action = 'promote'
EOF

# 4. Postgres を起動 — 指定時刻まで WAL をリプレイする
systemctl start postgresql

# 5. 確認:デバイスごとの最終受理シーケンスを確認
psql -U <DB_USER> -d <DB_NAME> \
  -c "SELECT device_id, MAX(sequence) FROM audit_records GROUP BY device_id;"

復旧確認チェックリスト

  • デバイスごとの最終シーケンスがインシデント前のスナップショットと一致する
  • ハッシュチェーンの連続性を確認:eds verify-chain <exported-records.json>
  • 操作ログにリカバリ対象時刻前後のギャップがないことを確認する
  • 確認完了後、アラート抑制を解除する

S3 / MinIO — オブジェクトのリストア

# 特定バージョンのオブジェクトをリストア
aws s3api get-object \
  --bucket <BUCKET> \
  --key <OBJECT_KEY> \
  --version-id <VERSION_ID> \
  <OUTPUT_FILE>

障害訓練スケジュール

以下の訓練を四半期ごとに実施し、ランブックの正確性を検証します:

訓練手順合格基準
DB フェイルオーバープライマリ Postgres を停止してレプリカを昇格30 分以内にインジェストが再開
DB リストアステージング環境で 1 時間前への PITR を実施30 分以内にチェーン連続性を確認
S3 オブジェクト復旧削除したテストオブジェクトをリストアバイト単位で元のオブジェクトと一致
アラート発火テストハーネスで不正な署名を注入2 分以内に P1 アラートが発火