1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CLIのJSONレスポンス解析を効率化するCLIツールを作った話 - 日常業務の時短テクニック

Posted at

はじめに

AWSインフラエンジニアとして働く中で、「AWS CLIの出力JSON、毎回構造把握に時間かかりすぎ...」という課題を感じていました。障害対応や定期監査で頻繁にAWS CLIを使う中で、この無駄な時間を解決したくて開発したのが「hawk」というCLIツールです。

本記事では、実際の業務でどのような課題があり、hawkによってどれだけ効率化できたかを、具体例とともにお話しします。

日常業務での課題:AWS CLIとの格闘

障害対応時のリアルな困りごと

深夜のアラート対応。緊急事態でインスタンスの状態を確認したい時:

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 > instances.json
cat instances.json

問題点

  • 100行を超えるJSONが流れる
  • 欲しい情報(インスタンス状態)がどこにあるか分からない
  • lessでスクロールしながら目視確認
  • 緊急時に時間をロスしてしまう

定期監査での非効率

月次のリソース監査作業:

# 全インスタンスの情報取得
aws ec2 describe-instances --query 'Reservations[].Instances[]' > all_instances.json

# jqで必要な情報を抽出しようとするが...
jq '.[] | {InstanceId: .InstanceId, State: .State.Name, Type: .InstanceType}' all_instances.json

問題点

  • jqの複雑な構文を毎回調べる必要
  • 複数のフィールドを組み合わせた表示が難しい
  • 集計やグルーピングが面倒

コスト最適化分析での課題

# インスタンスタイプ別の集計をしたいが...
jq 'group_by(.InstanceType) | map({type: .[0].InstanceType, count: length})' all_instances.json

問題点

  • jqの高度な機能は学習コストが高い
  • 毎回同じような処理を一から書く
  • チームメンバーが理解しにくい

解決策:hawkによる業務効率化

構造把握の劇的な改善

Before(従来の方法)

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 > instances.json
cat instances.json | less  # 延々とスクロール...

After(hawkを使用)

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 | hawk '. | info'

# === 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

効果: 構造把握の時間が5分 → 10秒に短縮

障害対応の効率化

緊急時のインスタンス状態確認

# hawkでの迅速な確認
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 | hawk '.Reservations[0].Instances[0].State'

# Code  Name
# 16    running

複数インスタンスの一括確認

# 停止中のインスタンスを探す
aws ec2 describe-instances | hawk '.Reservations[0].Instances[].State | select(.Name == "stopped")'

# Code  Name
# 80    stopped

効果: 障害対応での初期確認時間を50%短縮

定期監査の自動化

インスタンス情報の一覧表示

# 必要な情報だけを抽出
aws ec2 describe-instances | hawk '.Reservations[0].Instances[0] | select_fields(InstanceId, InstanceType, State)'

# InstanceId           InstanceType  State
# i-1234567890abcdef0  t3.micro      {Name: "running", Code: 16}
# i-0987654321fedcba0  t3.small      {Name: "stopped", Code: 80}

インスタンスタイプ別の集計

# 簡単な集計処理
aws ec2 describe-instances | hawk '.Reservations[0].Instances[] | group_by(.InstanceType) | count'

# InstanceType  Count
# t3.micro      5
# t3.small      3
# t3.medium     2

効果: 監査レポート作成時間を2時間 → 30分に短縮

セキュリティ監査での活用

セキュリティグループの確認

# 特定のポートが開いているインスタンスを探す
aws ec2 describe-instances | hawk '.Reservations[0].Instances[].SecurityGroups[]' --format table

# GroupName         GroupId
# launch-wizard-1   sg-1234567890abcdefg
# web-server-sg     sg-0987654321fedcba0

タグ情報の確認

# 環境タグでインスタンスを分類
aws ec2 describe-instances | hawk '.Reservations[].Instances[].Tags | select(.Key == "Environment")' --format table

# Key          Value
# Environment  production
# Environment  staging

他のAWSサービスでの活用例

S3バケットの分析

# バケット情報の構造確認
aws s3api list-buckets | hawk '. | info'

# バケット作成日での並び替えや分析
aws s3api list-buckets | hawk '.Buckets[] | select_fields(Name, CreationDate)'

Lambda関数の管理

# Lambda関数の一覧とランタイム確認
aws lambda list-functions | hawk '.Functions[] | select_fields(FunctionName, Runtime, LastModified)'

# 特定のランタイムの関数のみ抽出
aws lambda list-functions | hawk '.Functions[] | select(.Runtime == "python3.9")'

CloudFormationスタックの監視

# スタックの状態確認
aws cloudformation describe-stacks | hawk '.Stacks[] | select_fields(StackName, StackStatus, CreationTime)'

# 失敗状態のスタックを特定
aws cloudformation describe-stacks | hawk '.Stacks[] | select(.StackStatus == "CREATE_FAILED")'

今後のチーム展開への期待

想定される効果

学習コストの削減

  • 直感的なpandas風構文により、jqより習得しやすい
  • 統一されたクエリ言語でナレッジ共有が期待できる
  • 段階的学習が可能な設計

運用手順書の改善可能性

現在のjqコマンド例

jq -r '.Reservations[] | .Instances[] | select(.State.Name == "running")' instances.json

hawkでの表現

hawk '.Reservations[].Instances[] | select(.State.Name == "running")' instances.json

便利なエイリアス例

# よく使うパターンのエイリアス化
alias ec2-running="aws ec2 describe-instances | hawk '.Reservations[].Instances[] | select(.State.Name == \"running\")'"
alias ec2-count="aws ec2 describe-instances | hawk '.Reservations[].Instances[] | group_by(.InstanceType) | count'"

ROI(投資対効果)分析

開発時間 vs 効果

開発投資

  • 開発期間: 約1ヶ月(プライベート時間)
  • 学習時間: Rust習得含めて約3ヶ月

日常業務での効果(1日あたり)

  • 構造把握時間: 10分短縮
  • 集計作業時間: 15分短縮
  • 手順書確認時間: 5分短縮
  • 合計: 約30分/日の短縮

チーム全体での効果(5人チーム)

  • 個人あたり: 30分/日 × 20営業日 = 10時間/月
  • チーム全体: 10時間 × 5人 = 50時間/月
  • 年間効果: 600時間(約4人月相当)

副次的な効果

  • エラー削減: 手動作業のミス減少
  • 属人化解消: 誰でも同じ方法で分析可能
  • 新人教育: 学習コストの削減
  • ドキュメント品質: 手順書の可読性向上

導入時の配慮点

セキュリティ面での配慮

# データの外部送信なし(ローカル処理のみ)
hawk '. | info' sensitive-data.json  # 安全

# AWSクレデンシャルとは独立
# hawk自体はAWS APIを呼ばない

既存ワークフローとの親和性

# 既存のパイプラインに組み込み可能
aws ec2 describe-instances | hawk '.Reservations[].Instances[0]' | hawk '.InstanceId' | xargs -I {} echo "Processing: {}"

# 結果をファイルに保存
aws ec2 describe-instances | hawk '.Reservations[].Instances[]' --format csv > instances.csv

チーム展開の検討

今後、以下のような段階的な展開を検討しています:

  1. 効果測定: 個人での使用効果をさらに詳細に測定
  2. ドキュメント整備: よく使うパターンのチートシート作成
  3. 勉強会企画: 30分程度の簡単な説明会を検討

まとめ:業務効率化の実際

個人での効果

  • 作業時間: 30分/日の短縮
  • 学習コスト: jqと比較して習得が容易
  • エラー率: 手動作業でのミス減少

定性的な効果

  • ストレス軽減: 複雑なコマンドを覚える必要がない
  • 集中力向上: 本来の業務に時間を割ける
  • チーム共通言語: 統一されたツールでナレッジ共有が円滑

今後の展開可能性

  • チーム導入: 効果測定後の横展開を検討
  • CI/CD組み込み: 自動化パイプラインでの活用
  • 監視連携: アラート情報の整理に活用

さいごに

hawkの開発・導入により、個人の日常業務が大幅に効率化されました。特に「学習コストの低さ」と「直感的な操作感」により、複雑なjqコマンドを覚える負担から解放されています。

同じような課題を抱えているインフラエンジニアの方がいらっしゃいましたら、ぜひ一度試してみてください。

関連リンク

実際に試してみる

# インストール (macOS/Linux)
brew install kyotalab/tools/hawk

# インストール (Rustがインストールされている場合)
cargo install hawk-data

# AWS CLIと組み合わせて試用
aws ec2 describe-instances | hawk '. | info'

この記事が業務効率化の参考になりましたら、いいね👍やストック📚をお願いします!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?