色々あって こちらやこちらやこちらが使えなかったので、
あったやつだけで頑張ったあれのメモ
前提
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個しか動かすつもりがないのでこんな感じで
おつかれやまでした