すでに結構色んな所で取り上げられている 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
に展開してくれるでしょうが、今のところそれっぽいのは見つけられなかった。
実践サンプル
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 をガッツリ使い込む」