すでに結構色んな所で取り上げられている aws-cli の --queryですが、使ってみました。
とりあえずこれ試してみよう!
これを紹介だけで、このエントリの90%の価値が含まれております。騙されたと思ってやってみて。ぜひ
能書き
xpathってご存知?要は、xmlに対するクエリ言語のようなもので、xmlの構成に合わせてxpathを指定することにより、狙った特定の要素だけを引っ張り出したり、加工したりできます。最近の人はxmlは嫌いらしいですが、まあ、json も xmlの冗長部分を削いだものなので同じことがjsonに対してもできるってことですね。これがjmespath
のはず、名前の付け方からして。ちなみに私はxpathで一発クエリで超複雑なxmlから、特定要素をスコンと狙い撃ちする感覚が大好き、快感です。
jmespath
ですが、はっきり言ってjq
と機能的にかぶってます。xpathをやったことある人ならjmespathの方が多少学習コストが低いかもしれませんが、jemspathを積極的に使う理由は、プログラム上からの利用です。
上を見る限り、python,php,js,luaの4言語があります。rubyがハブられているのはやなかんじですが。js版はネイティブコードが一切絡まないので、GASやLambdaに容易にぶち込めるでしょうし、npmにも入ってる。まあ、jsonの展開なら本家本元のjavascriptに普通にやらせればいいというツッコミは置いといて。
jqはコマンドラインから使えるのが利点ですが、名前の付け方があまりよろしくなかったと思う。npmでjqとかで検索すると、JQueryのラッパーとかに引っかかってしまう。誰かが本気出せば jqの文法が通るライブラリを npmに展開してくれるでしょうが、今のところそれっぽいのは見つけられなかった。
実践サンプル
Route53のapex zone の AレコードAliasのDNSNameを狙い撃ち
aws route53 list-resource-record-sets --hosted-zone-id %hzid% \ --query 'ResourceRecordSets[?Name==`%your fqdn term .`].AliasTarget[].DNSName'
CloudFront ステータスが InProgressのやつだけ狙い撃ち
aws cloudfront list-distributions --query 'DistributionList.Items[?Status==`InProgress`].Id'
CloudFront の CNAME を狙い撃ち
aws cloudfront list-distributions --query 'DistributionList.Items[?Aliases.Items[0]==`%your fqdn%`].Id'
まとめ
aws限定だと jq があるからあんまり積極的に使う理由もないけど、結構面白い。And条件については、パイプの構文を使えば良さそうだけど、よくわかっていない。詳しくなったらまた書くつもり。