本番DBでAIを動かした結果、起きたこと。
先週の火曜日、午前3時。システムが毎分12,000件の書き込みに達した。ループが発生し、すべてがフリーズした。バグ自体は単純な1行のエラーだったが、その原因はそれよりもずっと深刻なものだった。
データベースのマイグレーションを実行している際、Claude Codeで権限スキップのフラグを有効にしていた。ステージング環境を使っているつもりだったが、間違いだった。envファイルを誤設定しており、開発用の代わりに本番環境の認証情報を読み込んでしまっていたのだ。
Claudeは許可を求めてこなかった。フラグによって、許可を求めないよう指示されていたからだ。マイグレーションは、カラムを削除する代わりに、新しいカラムを追加してしまった。データの損失はなかったが、危ういところだった。
私の考えに誤りがあった。権限をスキップすることは、単に煩わしいポップアップを消すだけだと思っていた。しかし実際には、人間がコマンドを確認できる唯一の瞬間を奪ってしまうのだ。
フラグをオフにするだけでは不十分だ。それでは、午前3時の疲れ切った状態で、無意識にクリックして進めてしまうプロンプトが追加されるだけになってしまう。
私は設定ファイルに拒否(deny)ルールを追加することで、この問題を解決した。
ローカルコマンドに対しては特定の許可(allow)ルールを使用し、それ以外のすべてのデータベースコマンドに対しては拒否ルールを使用している。特定のルールが優先される仕組みだ。これにより、本番環境のデータベースコマンドが実行される前にすべてブロックされる。
現在、私は3層の安全策を講じている:
- 厳格な許可(allow)および拒否(deny)ルールを設定した設定ファイル。
- ステージング環境の認証情報のみを保持する、マイグレーション専用の別個の git worktree。
- 本番環境に触れる前に必ず確認を求めるようAIに指示する CLAUDE.md ファイル。
注意点として、CLAUDE.md 内の指示は、チャットセッションが長くなると効力が弱まる可能性がある。重要なルールは、プロンプトの中で再度明示する必要がある。
私のセットアップと詳細な設定内容について、全容をまとめた。
学習コミュニティ(任意): https://t.me/GyaanSetuAi