じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

運用では確認以外を自動化したいという時もある

はじめに

こんにちは、ウェブオペレーターの皆さん。今日は、運用の自動化を推進しつつ、重要な確認ステップを保持する方法について、私が開発したツール「toi」を交えてお話しします。

また、これらのツールが完全な自動化が許されない環境や状況でも活用できる方法に焦点を当てていきます。

toiの開発背景

toiの開発は、私自身がウェブオペレーションの現場で直面した具体的な課題から始まりました。完全な自動化を目指す一方で、重要な判断には人間の介入が必要な場面が多々ありました。例えば:

  1. スクリプト1の実行結果を確認し、その出力をスクリプト2の入力としてコピーペーストする必要がある場合。
  2. 本番環境で実行する前に、一旦出力を確認するために実行コマンドを削除して dry-run する必要がある場合。

これらの操作は、既存の自動化ツールでは効率的に処理することが難しく、人間の手動介入が必要でした。そこで、Unixパイプラインの柔軟性を活かしつつ、必要な箇所で人間の判断を挟むことができるツールの開発を考えました。これが toiの誕生につながったのです。

運用自動化の現実と課題

運用の自動化は効率性と一貫性を高める素晴らしい方法です。しかし、現実には完全な自動化が許されない、あるいは望ましくないケースが多々あります。

  1. 組織のポリシー:特定の操作に人間の承認が必須な場合
  2. リスク管理:ミスの影響が甚大な操作
  3. 異常検知:通常とは異なる状況で、人間の判断が必要な場合
  4. 段階的な自動化:完全自動化への移行過程で、部分的に人間の確認を残す必要がある場合

これらの状況下では、完全な自動化と手動操作の間でバランスを取る必要があります。そこで登場するのが「toi」です。

toiの紹介

「toi」(発音は「とい」)は、Unixスタイルのパイプラインに対話的な確認ステップを追加するコマンドラインツールです。このツールを使用することで、自動化プロセスに人間の判断を効果的に組み込むことができます。

github.com

toiの主な特徴

  • パイプライン内での対話的確認
  • カスタマイズ可能なタイムアウト
  • デフォルト応答オプション
  • 柔軟なプロンプトメッセージ
  • 軽量で高速な動作
  • 他のUnixツールとの優れた互換性

toiの技術的詳細

toiは、Go言語で実装されています。その主な技術的特徴は以下の通りです:

  1. 標準入出力の効率的な処理: Goのio/ioutilパッケージを活用し、大量のデータでも効率的に処理します。
  2. 並行処理: Goのgoroutineを使用し、タイムアウト処理と入力待ちを並行して行います。
  3. シグナルハンドリング: SIGINT(Ctrl+C)などのシグナルを適切に処理し、ユーザーが操作を中断できるようにしています。

toiは、Unixパイプラインとの親和性が高く、学習コストが低いという点で他のツールと差別化されています。

完全自動化が許されない状況でのtoiの活用

  1. 重要データの更新確認
   echo "UPDATE user_data SET status = 'INACTIVE' WHERE last_login < '2023-01-01';" | toi -p "長期間ログインのないユーザーを非アクティブにしますか? (y/n): " | mysql user_db

ユーザーステータスの一括変更など、重要な更新操作の前に確認が必要な場合に有効です。

  1. システム設定変更の承認
   ./generate_config_update.sh | toi -t 300 -p "新しい設定を適用しますか? (y/n): " | sudo apply_config

システム設定の変更に必ず人間のレビューを要求している場合に使用できます。

  1. 大規模データ操作の制御
   find /data/old_records -type f -mtime +365 | toi -y -p "1年以上経過した記録を削除しますか? (Y/n): " | xargs rm

大量のデータ削除など、影響範囲が大きい操作で人間の判断を仰ぐことができます。

  1. 重要な自動処理の承認
   echo "実行する重要な処理の内容" | toi -t 600 -p "この重要な処理を実行しますか? (y/n): " && ./run_critical_process.sh

組織のポリシーで、重要な自動処理の実行前に人間の承認が必要な場合に利用できます。

toiによる運用改善のポイント

  1. リスク管理の向上: 重要な操作前に人間の判断を介在させ、潜在的なリスクを軽減します。
  2. 段階的自動化の実現: 完全自動化への移行過程で、徐々に人間の介入を減らしていくことができます。
  3. 異常検知と対応: 通常と異なる状況を人間に通知し、適切な判断を仰ぐことができます。
  4. 操作の記録: 重要な操作に対する承認プロセスを記録し、後日の確認に備えることができます。
  5. 柔軟なワークフロー構築: 既存の自動化スクリプトに容易に組み込め、段階的な改善が可能です。

導入と使用方法

toiは簡単に導入できます。Go環境がある場合は以下のコマンドでインストールできます:

go install github.com/nwiizo/toi@latest

または、GitHubリリースページから直接バイナリをダウンロードすることもできます。

基本的な使用方法は以下の通りです:

command1 | toi [オプション] | command2

主なオプション: - -t, --timeout int: タイムアウト時間(秒)を設定 - -y, --yes: 入力がない場合にデフォルトでYesを選択 - -n, --no: 入力がない場合にデフォルトでNoを選択 - -p, --prompt string: カスタムプロンプトメッセージを設定

制限事項と注意点

  • 現在のバージョンでは、複雑な条件分岐やループ処理には対応していません。
  • 大量のデータを扱う場合、メモリ使用量に注意が必要です。
  • セキュリティ上の理由から、リモート実行には適していません。

まとめ

「toi」を活用することで、完全な自動化が許されない状況下でも、運用の効率化と人間の判断の両立が可能になります。組織のポリシーやリスク管理など、様々な理由で人間の介入が必要な場面で、toiは自動化と手動操作のバランスを取るための強力なツールとなります。

自動化を推進しながらも、クリティカルな判断には人間の介入を残すという、バランスの取れたアプローチを実現するツールとして、ぜひ「toi」を検討してみてください。組織の要件に合わせて柔軟に運用プロセスを設計し、効率性と安全性の両立を図ることができます。

あれがほしいとかこの機能が無いとはPRいただきたいです。あと、みんなGithubにStarして♥