awscliで情報を取ってきて整形したいときはまずfilterとqueryで頑張る

awscliでインスタンス情報を取ってきて必要な部分だけを一覧にしようと思ったのですが、これをawkとかでやろうとすると中々に辛い。。。
そんな時はawscliのfilterとqueryを使うと良いようです。

「running状態のインスタンスのインスタンスID、作成日、Nameを一覧として取得」するケースを考えてみたいと思います。
インスタンス情報一覧を取得するためにはdescribe-instancesを使うことになります。

$ aws ec2 describe-instances

これだけだと全てのインスタンスの情報を取ってきてしまうので、running状態のインスタンスだけに絞りたい所です。
このような結果の絞り込みにはfilterを利用します。

$ aws ec2 describe-instances \
    --filter Name=instance-state-name,Value=running

インスタンスの状態を表すフィルタ名はinstance-state-nameなので、filterオプションのNameにinstane-state-nameを与えValueにはrunningを与えます。
フィルタ名やその値は各コマンドのリファレンスを参照しましょう。

上記のコマンドでrunning状態のインスタンス情報だけを取ってくることができました。しかしこのままでは出力される情報量が多すぎるので、queryによって出力項目を絞り込みます。

とりあえずInstanceIDだけを出力してみます。

$ aws ec2 describe-instances \
    --filter Name=instance-state-name,Value=running \
    --query Reservations[].Instances[].InstanceId

queryで出力項目を絞るにはまず、aws-cliリファレンスのOutPutの部分を参照し、結果として得られるオブジェクトの構造を把握しておきます。
describe-instancesの場合、InstanceIdはReservations.Instances.InstanceIdの位置にあるので、上記のようなqueryオプションで絞り込むことができます。

さらに作成日も追加してみます。

$ aws ec2 describe-instances \
    --filter Name=instance-state-name,Value=running \
    --query Reservations[].Instances[].[InstanceId, LaunchTime]

複数項目を出力する場合は[]で括ってカンマ区切りで並べます。

さらにNameを追加してみます。

$ aws ec2 describe-instances \
    --filter Name=instance-state-name,Value=running \
    --query Reservations[].Instances[].[InstanceId, LaunchTime, Tags[?Key==`Name`].Value]]

NameはNameタグの値として入っているので複雑になります。
Tags[?Key==Name]とすることでTagsの中からキーがNameのものだけを絞り込んで取得することができます。比較する値はバッククォートで括る点に注意です。

以上で「running状態のインスタンスのインスタンスID、作成日、Nameを一覧として取得」して、出力することができました。
出力の順番や見た目が気に入らない場合はさらにこの結果をawkしていくことになります。
シェルスクリプトなどでawsコマンドの実行結果を変数に入れるときは、エスケープの問題からバッククォートではなく$()を用いた方がいい感じです。

#!/bin/sh

#``ではなく$()を使う
list=$(aws ec2 describe-instances \
    --filter Name=instance-state-name,Value=running \
    --query Reservations[].Instances[].[InstanceId, LaunchTime, Tags[?Key==`Name`].Value]])
echo "$list" | awk '{ 後はawkで頑張る }'