LoginSignup
1
2

More than 5 years have passed since last update.

peco, jq, aws-cliでEC2にSSHするワンライナー

Last updated at Posted at 2017-04-03

色々あって こちらこちらこちらが使えなかったので、
あったやつだけで頑張ったあれのメモ

前提

aws configure --profile hoge
などを使って適宜Profileを設定しておくこと
(output formatはjsonになるように)

jq, pecoがいい感じに実行できること

やること

こんな感じで頑張る

aws ec2 describe-instances --profile hogehoge | jq ".Reservations[].Instances[] | select(has(\"PublicIpAddress\")) | {InstanceId, PublicIpAddress, InstanceName: (.Tags[] | select(.Key==\"Name\").Value)}" | jq -r 'to_entries | [.[].value] | @csv' | peco | cut -f 3 -d , | xargs -o -n 1 ssh -i ~/keys/hogehoge.pem -l ec2-user

やってること

1つめ

aws ec2 describe-instances --profile hogehoge

インスタンス一覧をとってくる

2つめ

jq ".Reservations[].Instances[] | select(has(\"PublicIpAddress\")) | {InstanceId, PublicIpAddress, InstanceName: (.Tags[] | select(.Key==\"Name\").Value)}"

インスタンス情報が返ってくる所で、 PublicIpAddress を持つInstanceだけを拾ってきて、以下のようなJSONに整形する

ここのselect(has(\"PublicIpAddress\"))を調整したり、すると、他のパラメータを使うよう変更したりできる

{
   "InstanceId": <Instance1のid>,
   "PublicIpAddress": <Instance1のPublicIP>,
   "InstanceName": <Instance1のNameタグの値>
},
{
   "InstanceId": <Instance2のid>,
   "PublicIpAddress": <Instance2のPublicIP>,
   "InstanceName": <Instance2のNameタグの値>
},
...

3つめ

jq -r 'to_entries | [.[].value] | @csv'

整形されたJSONを下記のようなCSVに変換する

<Instance1のid>,<Instance1のNameタグの値>,<Instance1のPublicIP>
<Instance2のid>,<Instance2のNameタグの値>,<Instance2のPublicIP>
...

2つめで指定した順番どおりになってないけど、
どうやら to_entries をする際にパラメータ名でソートされてしまう模様

4つめ

peco

pecoで検索できるように渡してあげる

5つめ

cut -f 3 -d ,

3番目のフィールドにPublicIPがあるので、
デリミタを,で指定して3番目のフィールドの値を拾ってくる

6つめ

xargs -o -n 1 ssh -i ~/keys/hogehoge.pem -l ec2-user

xargsで値を拾ってsshしてあげる

xargs経由でsshする時は、-oオプションを指定して標準入力を再度開いてあげないと上手く動かないっぽかった。
-n 1オプションは、1個しか動かすつもりがないのでこんな感じで

おつかれやまでした

1
2
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
2