続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

aws-cli で使える --query = jmespath をガッツリ使い込む

すでに結構色んな所で取り上げられている aws-cli の --queryですが、使ってみました。

とりあえずこれ試してみよう!

JMESPath Tutorial — JMESPath

これを紹介だけで、このエントリの90%の価値が含まれております。騙されたと思ってやってみて。ぜひ

能書き

xpathってご存知?要は、xmlに対するクエリ言語のようなもので、xmlの構成に合わせてxpathを指定することにより、狙った特定の要素だけを引っ張り出したり、加工したりできます。最近の人はxmlは嫌いらしいですが、まあ、jsonxmlの冗長部分を削いだものなので同じことがjsonに対してもできるってことですね。これがjmespathのはず、名前の付け方からして。ちなみに私はxpathで一発クエリで超複雑なxmlから、特定要素をスコンと狙い撃ちする感覚が大好き、快感です。

jmespathですが、はっきり言ってjqと機能的にかぶってます。xpathをやったことある人ならjmespathの方が多少学習コストが低いかもしれませんが、jemspathを積極的に使う理由は、プログラム上からの利用です。

jmespath · GitHub

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