🦅

インフラエンジニアが作った『hawk』- なぜawkを再発明したのか?

に公開

TL;DR

AWSインフラエンジニアが、日常業務での「JSONやYAMLの構造把握」の課題を解決するために開発したCLIツールhawkの開発背景をお話しします。

  • 💡 課題: AWS CLI出力やK8sマニフェストの構造把握に時間がかかる
  • 🎯 解決: info機能による一発構造把握 + pandas風の統一クエリ言語
  • 🚀 結果: 学習コストを下げながら、日常業務を効率化

背景:インフラエンジニアの日常的な困りごと

AWS CLIレスポンスとの格闘

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 > instance.json
cat instance.json  # 100行超のJSONが流れる...

「インスタンスの状態確認したいだけなのに」という場面で:

  1. lessでスクロール地獄を体験
  2. フィールドパスを推測しながらjqで試行錯誤
  3. 毎回同じ作業の繰り返し

既存ツールの限界

awk: 構造化データに非対応、覚えにくい構文

awk -F',' '{print $2}' data.csv  # CSV専用、毎回ググる

jq: JSON専用、YAMLには変換が必要

yq -o json config.yaml | jq '.some.field'  # 手間が多い

pandas: 重厚すぎる、CLI向きではない

# ちょっとした確認でPython起動...
import pandas as pd

解決策:hawkの設計思想

コンセプト: 「pandas風の操作感をCLIで」

  • 🎯 統一クエリ言語: JSON/YAML/CSV同じ書き方
  • 📊 構造俯瞰: info機能でデータ構造を一発把握
  • 🧠 学習しやすさ: シンプルで覚えやすい構文
  • 軽量: Rust製、シングルバイナリ

Before/After: 実際の改善例

従来の方法 😤

# 構造把握のために試行錯誤
jq '. | keys' instance.json         # ["Reservations"]
jq '.Reservations[0] | keys' instance.json  # さらに深く...
jq '.Reservations[0].Instances[0].State.Name' instance.json  # やっと到達

hawk使用時 😊

# 一発で構造把握
hawk '. | info' instance.json
実際のhawk出力例
=== Data Information ===
Total records: 1
Type: Object Array
Fields: 1

Field Details:
  Reservations    Array      (e.g., [1 items])

Array Fields:
  Reservations    [1 items]
    └─ Groups, Instances, OwnerId, ReservationId
# 段階的に詳細確認
hawk '.Reservations[0].Instances[0] | info' instance.json
# → 41個のフィールド情報が型付きで一覧表示

# 直感的なデータアクセス
hawk '.Reservations[0].Instances[0].State' instance.json
# Code  Name
# 16    running

hawkの実践的な活用

日常業務での使用例

# 1. インスタンス情報の確認
hawk '.Reservations[0].Instances[0].State' instance.json
# → テーブル形式で自動表示

# 2. 必要なフィールドのみ抽出
hawk '.Reservations[0].Instances[0] | select_fields(InstanceId, PublicIpAddress, PrivateIpAddress)' instance.json

# 3. 複数インスタンスの分析
hawk '.Reservations[0].Instances[].State | select(.Name == "running")' multi-instances.json

# 4. 集計処理
hawk '.Reservations[0].Instances[] | group_by(.InstanceType) | count' multi-instances.json

設計の工夫: シンプルさを重視

# 推奨: 段階的なアプローチ
hawk '.Reservations[0].Instances[].Placement' instance.json
hawk '.Reservations[0].Instances[].Placement | group_by(.AvailabilityZone) | count' instance.json

# 理由: デバッグしやすく、エラーが起きにくい

この設計により:

  • 構文エラーが起きにくい
  • 段階的にデバッグ可能
  • 学習コストが低い

技術的な選択

なぜRustなのか

  • パフォーマンス: 高速で軽量なバイナリ
  • 信頼性: 型安全性による実行時エラーの削減
  • 配布性: シングルバイナリでの簡単インストール
  • 学習機会: 個人的なスキルアップ目標

CLIツールとしての利点

  • 既存ワークフローへの統合: パイプラインでの組み合わせ
  • 自動化対応: スクリプトでの利用が容易
  • 軽量性: GUIツールにない手軽さ

インパクトと今後

解決できた課題

  1. 時間短縮: 構造把握の時間を大幅削減
  2. 学習コスト削減: 覚えやすい統一構文
  3. エラー削減: シンプルな設計による間違いの減少
  4. 生産性向上: 日常タスクの効率化

開発者としての学び

  • OSS開発の実践経験
  • Rustエコシステムの理解
  • CLIツール設計のノウハウ
  • ユーザビリティの重要性

まとめ

hawkは「インフラエンジニアの現場ニーズ」から生まれたツールです。

  • 🎯 課題解決: 構造化データの俯瞰把握
  • 🚀 効率化: 日常業務の時間短縮
  • 🧠 学習性: 覚えやすい構文設計
  • 軽量性: Rust製の高速CLI

同じような課題を抱えるインフラエンジニアの方に、ぜひ試していただきたいです。

リンク

次回予告

次回は「Rustで学ぶCLIツール設計 - hawkの内部アーキテクチャ」として、実装の詳細を解説予定です。


📢 最新アップデート(2025年7月16日追記)

hawk v0.2.0をリリースしました!主な新機能:

  • 🆕 テキストファイル対応: ログ解析が可能
  • 🧵 文字列操作: trim, upper, replace等を追加
  • 📊 統計機能: median, stddev, unique, sort対応
  • 🎨 カラー出力: 見やすい色付き表示

詳細はv0.2.0リリース記事をご覧ください。


この記事は2025年7月12日の初回投稿内容です。最新機能については上記リンクをご確認ください。

📝 フィードバックや改善提案をお待ちしています!
💖 この記事が役に立ちましたら、いいねをお願いします

Discussion