giip
SES案件登録
AI運用参照のみ自動化承認ロールバック監査ログ障害対応パラメータ

AIの自動実行に承認とロールバックが必要な理由と、その設計方法

公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13

結論

承認とロールバックが必要な理由は、AIが誤るからというより、誰も気づかないまま本番の状態が変わることが最大の失敗モードだからです。設計では、変更前スナップショットの取得、承認ゲート、dry-runと本実行の分離、対象のallowlist、冪等性、実行前にロールバック手順が存在すること、監査ログ、段階的展開、停止スイッチの9点を揃えます。ロールバックできない操作は自動化しない、というのが線引きの基準です。

この文書の適用条件

対象製品AI運用ワークフロー全般(オーケストレータ製品に依存しない)
確認バージョン製品バージョンに依存しない設計上の説明(スナップショット例は SQL Server 2012 以降を想定)
適用環境AWS、Azure、オンプレミス
必要権限スナップショット取得には対象インスタンスへの接続権限。ワークフロー定義の編集権限
実行影響参照のみ(本文中のコマンドは状態を変更しません)
再起動不要
最終検証日2026-08-13

そのまま実行できるコマンド

ワークフローのステップ定義(dry_run / requires_approval / rollback を持たせる)参照のみ
対象
自組織の運用自動化ワークフロー定義
権限
ワークフロー定義の編集権限
変更作業
なし(定義の記述例)
Production実行
該当なし(設計サンプル)
# 対象: 自組織の運用自動化ワークフロー定義
# 権限: ワークフロー定義の編集権限
# 変更作業: なし(定義の記述例)
# Production 実行: 該当なし(設計サンプル)

workflow: sample-log-maintenance
  # 実行対象を明示的に限定する。ここに書かれていないホスト・DBには一切触れない
  scope:
    allowlist_hosts: [LEGACY-SQL01]
    allowlist_databases: [SampleDB]
    deny_if_role: [primary-replica-source]

  # 実行前に必ず状態を保存する。保存に失敗したら以降のステップへ進まない
  pre_snapshot:
    - id: capture-config
      command: dump-configuration
      required: true          # 失敗時は abort(スキップ不可)
      retention: 30d

  steps:
    - id: check-log-usage
      kind: read
      dry_run: false          # 参照のみなので dry-run の概念が無い
      requires_approval: false
      idempotent: true
      rollback: not-required   # 状態を変えないため

    - id: apply-parameter-change
      kind: write
      dry_run: true            # まず差分だけを出力して人が読む
      requires_approval: true  # dry-run の出力を見た人が承認して初めて本実行
      approvers: [ops-oncall, dba-lead]
      approval_expires_in: 2h  # 古い承認で実行されないように失効させる
      idempotent: true         # 同じ入力で2回流しても結果が変わらない
      rollback:
        exists: true           # 存在しない場合、この step は定義エラーとして拒否する
        command: restore-configuration --from capture-config
        verified_at: 2026-08-13

    - id: never-auto
      kind: write
      requires_approval: true
      auto_execute: forbidden  # 承認があっても自動実行経路からは呼ばない

  # 段階的展開: 1台 → 一部 → 全体。各段で停止条件を評価する
  rollout:
    stages: [canary(1), partial(25%), full]
    halt_on: [error_rate_increase, unexpected_diff, snapshot_missing]

  # 停止スイッチ: これを立てると進行中の実行も次のステップに進まない
  kill_switch:
    flag: /etc/ai-ops/HALT
    honored_between_steps: true

  # 状態記録: 各ステップの結果を永続化し、再開時に完了済みを再適用しない
  state_store:
    key: run_id + step_id
    values: [pending, running, succeeded, failed, rolled_back, skipped]
    resume_policy: skip-succeeded

この定義の要点は3つです。第一に rollback.exists が false のステップは定義段階で拒否すること。第二に承認に有効期限を持たせ、状況が変わった後の古い承認で実行されないようにすること。第三に state_store により、再開や再試行で同じ変更が二重に適用されないようにすることです。

変更前スナップショットを取得する(SQL Server の構成値)参照のみ
対象
SQL Server 2012 以降 / Amazon RDS for SQL Server
権限
対象インスタンスへの接続権限(`sys.configurations` は既定で参照可能)
変更作業
なし(参照のみ)
Production実行
可能
-- 対象: SQL Server 2012 以降 / Amazon RDS for SQL Server
-- 権限: 対象インスタンスへの接続権限(sys.configurations は既定で参照可能)
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    SERVERPROPERTY('MachineName')  AS machine_name,
    SYSDATETIMEOFFSET()            AS captured_at,
    c.configuration_id,
    c.name,
    c.value,                       -- 設定された値
    c.value_in_use,                -- 実際に効いている値
    c.is_dynamic,                  -- 再起動なしで反映されるか
    c.is_advanced
FROM sys.configurations AS c
ORDER BY c.name;

`value` と `value_in_use` が異なる場合、設定は変更済みだが再起動待ちの状態です。スナップショットとしては両方を保存してください。片方だけでは、戻すべき値がどちらか判断できません。

スナップショットをファイルに残し、変更後に差分を取る参照のみ
対象
自組織の運用ホスト(対象DBへ接続できる場所)
権限
対象DBへの接続権限と、保存先ディレクトリへの書き込み権限
変更作業
なし(DBの状態は変更しない。ファイルのみ出力)
Production実行
可能
# 対象: 自組織の運用ホスト(対象DBへ接続できる場所)
# 権限: 対象DBへの接続権限と、保存先ディレクトリへの書き込み権限
# 変更作業: なし(DBの状態は変更しない。ファイルのみ出力)
# Production 実行: 可能

SNAP_DIR=/var/lib/ai-ops/snapshots
RUN_ID=sample-run-0001
mkdir -p "$SNAP_DIR/$RUN_ID"

# 1) 変更前の構成を保存する(保存に失敗したら以降へ進まない)
sqlcmd -S LEGACY-SQL01 -U sample_user -d SampleDB -i capture_configuration.sql -o "$SNAP_DIR/$RUN_ID/before.txt" || exit 1

# 2) 変更を適用する(承認済みの場合のみ。ここでは実行しない)
echo "apply step は承認後に別経路で実行する"

# 3) 変更後に同じクエリを流し、差分を人が読める形で残す
sqlcmd -S LEGACY-SQL01 -U sample_user -d SampleDB -i capture_configuration.sql -o "$SNAP_DIR/$RUN_ID/after.txt"
diff -u "$SNAP_DIR/$RUN_ID/before.txt" "$SNAP_DIR/$RUN_ID/after.txt" > "$SNAP_DIR/$RUN_ID/diff.txt"

# 4) 差分が空でないこと(=意図した変更が入ったこと)と、想定外の行が無いことを確認する
cat "$SNAP_DIR/$RUN_ID/diff.txt"

パスワードをコマンドラインに直接書かないでください。認証情報は環境変数またはシークレットストアから渡します。スナップショットの保存先は、対象システムが停止しても読めるところに置いてください。

結果の読み方

意味確認するポイント
変更前スナップショット変更を適用する前の状態を保存すること保存に失敗したら実行を中止しているか。保存先は対象が停止しても読めるか
承認ゲート誰が・何を・どの条件で承認するかの定義承認者が実行者と別人か。承認に有効期限があるか
dry-run と本実行の分離差分だけを出力する実行と、実際に適用する実行を分けることdry-run の出力が人間の読める差分になっているか
対象のスコープ制限対象ホスト・対象DBの明示的なallowlistallowlistに無い対象へは、指示があっても実行されないか
冪等性同じ入力で複数回実行しても結果が変わらないこと再試行や再開で二重適用が起きないか
ロールバック手順の事前存在戻し方が実行前に決まっていることrollback が未定義のステップを、定義段階で拒否しているか
監査ログ実行者・実行時刻・入力・出力・承認者の記録5項目すべてが揃っているか。後から改変できない場所にあるか
段階的展開1台 → 一部 → 全体と広げること各段で停止条件を評価しているか。異常時に自動で止まるか
停止スイッチ進行中の自動実行を止める手段誰が押せるか。押した後、次のステップへ進まないことを確認済みか
状態記録(逐次実行)各ステップの状態を永続化すること再開時に成功済みステップを再実行しない設計になっているか

こういう状況で使います

  • 自動化した処理が動いていたはずなのに、いつから止まっていたのか分からない
  • 本番の設定がいつの間にか変わっていて、誰が変えたのか特定できない
  • 同じ自動実行を再試行したら、変更が二重に適用された
  • 自動実行を止めたいが、止める手段が「プロセスをkillする」しかない
  • 自動実行のログはあるが、承認者と入力値が記録されていない
  • dry-runの結果を見ずに本実行が走る経路が残っている

考えられる原因(可能性の高い順)

  1. 01

    検知と実行を同じ経路にまとめている

    異常を検知したエージェントがそのまま対処を実行する構成では、検知の誤りがそのまま状態変更につながります。検知と実行の間に承認を挟むことで、誤検知が状態を変えなくなります。

  2. 02

    実行対象が指示文から動的に決まる

    対象ホストやデータベース名を自然言語の指示から解決すると、意図しない対象に一致する可能性があります。allowlistで対象を静的に固定すると、この経路が閉じます。

  3. 03

    再試行が冪等でない

    タイムアウト後の再試行や、途中失敗からの再開で、すでに適用済みの変更がもう一度適用されることがあります。ステップ単位の状態記録が無いと、どこまで進んだかを判定できません。

  4. 04

    ロールバックを「あとで考える」ことにしている

    実行時点で戻し方が無い操作は、失敗した瞬間に選択肢が消えます。ロールバック手順の存在を実行の前提条件にすると、この状況を構造的に防げます。

  5. 05

    監査ログが実行ログで代用されている

    アプリケーションログには実行内容は残っても、承認者と承認時刻は残りません。事後に「誰の判断だったか」を再構成できないと、原因究明が推測になります。

確認手順

  1. 1

    自動実行の一覧を作る

    参照のみ

    現在動いている自動処理を列挙し、それぞれが状態を変更するか参照だけかを分類します。分類できないものは、まず参照のみに落とします。

  2. 2

    各自動実行のロールバック手順の有無を確認する

    参照のみ

    状態を変更するものについて、戻し手順が文書化されているか、実際に試したことがあるかを確認します。

  3. 3

    監査ログの5項目が揃っているか確認する

    参照のみ

    直近の自動実行を1件選び、実行者・実行時刻・入力・出力・承認者を再構成できるかを試します。

  4. 4

    停止スイッチの動作を検証環境で確認する

    停止フラグを立てて、進行中の実行が次のステップへ進まないことを確認します。本番では実施しないでください。

  5. 5

    再試行時の二重適用を検証環境で確認する

    途中で意図的に失敗させ、再開したときに完了済みステップが再実行されないかを確認します。

対応方法

すぐに実施できる低リスクの対応

  • 状態を変える自動実行を一時的に参照のみへ落とす

    設計が整うまでの間、検知と提案までを自動化し、実行は人が行います。動作を止めずに危険度だけ下げられます。

  • 対象のallowlistを定義する

    対象ホストとデータベースを列挙し、そこに無い対象へは実行しないようにします。最初に効果が出る対策です。

  • 停止スイッチを用意する

    フラグファイルや設定値で自動実行を止められるようにし、押せる人を明示します。

事前検討が必要な変更

  • dry-run と本実行を別のステップに分ける

    dry-runは差分を出力するだけ、本実行は承認済みの差分に対してのみ動く構成にします。

  • 承認ゲートを実装し、承認に有効期限を付ける

    承認者、承認対象、有効期限を定義します。有効期限が無いと、状況が変わった後の古い承認で実行される可能性があります。

  • ステップ単位の状態記録を入れる

    各ステップの状態を永続化し、再開時は成功済みをスキップします。逐次実行の途中失敗に耐える最小構成です。

  • 監査ログを改変できない場所に出す

    実行者・時刻・入力・出力・承認者を、実行主体が書き換えられない保存先に記録します。

  • 段階的展開を導入する

    1台で試し、停止条件に触れなければ範囲を広げます。全台同時適用を既定にしないことが目的です。

専門家のレビューが必要な作業

  • ロールバック不能な操作を自動実行経路から除外する

    専門家レビュー必須

    後述の操作クラスを自動実行の対象外として定義します。除外の線引きを誤ると不可逆な操作が無承認で走るため、実装前に設計レビューを行ってください。

  • 承認権限の設計を組織の責任分界に合わせる

    専門家レビュー必須

    誰が承認できるかは技術ではなく責任の問題です。サービス停止を伴う判断の承認者を、業務側と合意したうえで定義します。

!注意事項

  • 人間の承認なしに自動実行してはならない操作: データ削除、`KILL`、`SHRINK`、強制Failover、Replicationの初期化、CDCの再設定、インデックスの全体再構築、大規模な統計更新、パラメータ変更、スキーマ変更、DBの再起動、ファイアウォールおよび権限の変更、binlogの初期化、バックアップの削除。
  • これらに共通するのは、取り消しが困難であるか、実行中に他の処理を巻き込んで停止させる点です。承認を経たうえで、変更前スナップショットとロールバック手順を確認してから実行してください。
  • ロールバック手順が存在しない操作は自動化の対象にしないでください。「失敗したら手で直す」は手順ではありません。
  • 承認を求める通知を出すだけでは承認ゲートになりません。承認が得られるまで実行が進まないことを、実装で担保してください。
  • 段階的展開は停止条件とセットで初めて機能します。停止条件が無い段階的展開は、単に障害の発覚が遅れるだけです。
  • dry-runの出力を人が読まないまま承認する運用になっていないかを定期的に確認してください。形骸化した承認は、承認が無い状態と変わりません。

バージョン・環境による違い

参照のみの自動実行状態を変えない確認クエリの実行は、承認ゲートの対象外にしてかまいません。ただし対象のallowlistと監査ログは同じように必要です。
マネージドサービスの場合パラメータグループの変更やフェイルオーバーは、基盤側のAPIで実行されるため取り消し操作も基盤側の仕様に従います。ロールバック手順は各サービスの仕様を確認して作成してください。
コンテナ基盤の場合デプロイの巻き戻しは基盤の機能で実現できますが、データベースのスキーマ変更は巻き戻りません。アプリの切り戻しとデータの切り戻しは別の手順として持ってください。

これで解決しない場合に確認すること

  • 直近の自動実行を1件選び、5W1Hを再構成してみる

    誰が・いつ・何を・どの入力で・どの承認で実行したかを、ログだけから再構成できるかを試します。

  • 承認者が実行者と同一になっていないか確認する

    同一人物しか承認できない状態は、承認ゲートとしては形式だけのものになります。

  • 停止スイッチを押せる人を確認する

    深夜に異常が起きたとき、当番が単独で止められるかを確認します。

  • スナップショットの保存先が対象と運命を共にしていないか確認する

    同じサーバー上に保存していると、そのサーバーが失われたときにスナップショットも失われます。

  • allowlistの棚卸し時期を決める

    対象が増減したときにallowlistが更新されないと、実態と乖離します。

この文書の根拠と限界

一般的な技術説明

設計要素と操作クラスの線引きは、可逆性と影響範囲にもとづく一般的な運用設計です。SQL 例は SQL Server の `sys.configurations` の公開仕様に基づきます。「GIIP対応範囲」の段落のみ GIIP 自身の運用形態の記述であり、顧客事例ではありません。事故率や防止効果の数値は検証できないため記載していません。

よくある質問

どこまで自動化してよいですか?

影響が可逆で、対象がallowlistで限定されていて、ロールバック手順が実行前に存在し、監査ログが残る操作までです。この4条件のどれかが欠けるものは、承認ゲートの向こう側に置いてください。

承認は誰が行いますか?

実行者とは別の人が行います。加えて、サービス停止を伴う可能性がある操作は、技術担当だけでなく業務側の判断権限者を承認者に含めてください。停止するかどうかは技術判断ではないためです。

ロールバックできない操作はどう扱いますか?

自動実行の対象から外します。実行する場合は、変更前スナップショットの取得と、復旧手段(バックアップからの復元など)の所要時間の見積りを事前に用意したうえで、人が実行します。

dry-run があれば承認は不要ですか?

不要にはなりません。dry-runは差分を見せる仕組みで、その差分を適用してよいかの判断は別です。dry-runの出力を人が読み、その結果に対して承認する形にしてください。

途中で失敗した自動実行を再開すると二重適用されませんか?

ステップ単位で状態を永続化し、再開時に成功済みをスキップする設計にしていれば防げます。あわせて各ステップを冪等に作ると、状態記録が失われた場合の被害も抑えられます。

監査ログには何を残せばよいですか?

実行者、実行時刻、実行内容、入力と出力、承認者の5点です。保存先は、実行するエージェント自身が書き換えられない場所にしてください。

この文書がカバーする質問

  • AIワークフローの逐次実行と状態記録はどう設計するのか
  • AIに本番操作を任せるときの承認フローの作り方
  • 自動化してはいけないデータベース操作の一覧が知りたい

リスク表示の意味

  • 参照のみデータと設定を変更しません。
  • 影響は限定的ですが、権限と負荷の確認が必要です。
  • 性能・ロック・コストに影響する可能性があります。
  • 障害・データ損失・復旧作業が発生する可能性があります。
  • 専門家レビュー必須本番適用前に別途レビューが必須です。

GIIPの対応範囲

ここまでの設計要素は、特定のオーケストレータ製品を使わなくても実装できます。GIIP では AWS と Azure 上の複数データベースおよび約30の Web サービスを、AI エージェントと人間の専門家が継続的に監視・運用しており、AIエージェントが実行できるのは影響が可逆で対象が限定された操作までとし、上に挙げた操作クラスは人間の承認を経る形にしています。自組織で同じ設計を組む際に、どの操作をどちら側に置くかの線引きが決まらない場合は、現行の自動化の一覧をもとに整理することもできます。

執筆・技術検証

GIIP プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

自動実行の承認ラインを設計する

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

自動実行の承認ラインを設計する

ナレッジベース一覧へ