こんにちは、cloudpack今岡 です。

すでに結構色んな所で取り上げられている 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 はコマンドラインから使えるのが利点ですが、名前の付け方があまりよろしくなかったと思う。 npmjq とかで検索すると、JQueryのラッパーとかに引っかかってしまう。誰かが本気出せば jq の文法が通るライブラリを npm に展開してくれるでしょうが、今のところそれっぽいのは見つけられなかった。

実践サンプル

Amazon Route53 のapex zone の AレコードAliasのDNSNameを狙い撃ち

aws route53 list-resource-record-sets --hosted-zone-id %hzid% 
 --query 'ResourceRecordSets[?Name==`%your fqdn term .`].AliasTarget[].DNSName'

Amazon 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条件については、パイプの構文を使えば良さそうだけど、よくわかっていない。詳しくなったらまた書くつもり。

元記事はこちらです。
aws-cli で使える –query = jmespath をガッツリ使い込む