包丁一本さらしに巻いて

jungle: Simple UNIX-like AWS CLI

jungleというUNIX-likeにAWSを操作するCLIを作った。

利用方法抜粋

Listing all EC2 instances

jungle ec2 ls

Filtering EC2 instances by Name tag using wildcard

jungle ec2 ls *web*

Starting instance

jungle ec2 up -i i-xxxxxx

Stopping instance

jungle ec2 down -i i-xxxxxx

SSH login to instance specified by instance id

jungle ec2 ssh -i i-xxxxxx --key-file /path/to/key.pem

SSH login to instance specified by Tag Name

jungle ec2 ssh -n blog-web-server-01 --key-file /path/to/key.pem

TL;DR

  • もっとUNIX-likeにAWSを操作するCLIが欲しかった
  • AWSのTag:Nameを起点にsshログイン/情報取得できる機構が欲しかった
  • Clickというライブラリが良さそうだったから使ってみたかった

背景

既存の公式awscliは最高にフレキシブルだし全AWSのサービスに対応しており、自分も大変お世話になっている。しかし、オプションがやたら長かったり、「それ要る?」っていう機能てんこ盛りだったりという特徴もある(これはawscliが「AWSサービスとの連携においてできないことは無い」ってのをたぶん目指して作られているのでしょうが無い)。その為、正直普段使いのCLIとしては、素のままに使いづらいと言わざるを得ない、と思った。

また、今自分たちはAWSのTag:Nameを起点に色々なものを管理しており、サーバは作られては消えているので、IPやdomain等ではなくTag:Nameを使ってログイン/状態参照/ログ参照できるようにできたら便利だろう、というのがある。

解決策

  • それec2sshでできない?
    • EC2にログインする部分は対応できそうだけど、bastionサーバ経由してssh proxyしたりとかできないっぽいし、これは結局IPとDomainを更新し続ける使い方だなと思った
    • 追加で、ELBにぶら下がってるインスタンスのIDやらステータスやら確認したかった
    • 追加で、ASGやLCもCLIから確認したかった
    • 可能なら同じようなUIで
  • それawscliでインスタンスID指定してjqでpublic_ipを取得してsshにパイプで渡せばいいんじゃない?
    • EC2にログインする部分は対応できそうな気がする
    • ただ、その他微妙に他のAWSサービスでもやりたい事ある
  • 複雑なawscliのコマンドに分かりやすいaliasをつければよいのでは?
    • その通りそれでも可能だと思うけど、共有しづらくない?
  • filterする部分とかは--filters file://filters.jsonとかでJSONにまとめておけばよいのでは?
    • その通りそれでも可能だと思うけど、共有しづらくない?
  • awscliは「不可能なことは無い」ように作られてるけど、もっとそぎ落として日々のオペレーションで良く使うものだけまとめてPyPIで公開してpip installしてもらった方が楽なのでは?

と、色々書いてみたけど恐らく色んな代替案があるし、どれを実行してもなんとなくうまくできそうな気はしている。ただ、自分がよく実行するオペレーションを覚えやすい形で、ある程度の柔軟性だけ持たせて保存しておきたかった。あと、Click使いたかったしPyPIに何か登録してみたかったので書いた感もある。

ちょっと誰か使ってみて感想きかせて欲しいっす!!!!初Python OSSっす!!!!