AWS CLIのレスポンス、どう処理してますか?
AWS CLIの各種コマンドは特に指定しなければ、レスポンスがJSONフォーマットで返ってきますよね。
なので皆さんその中から情報探そうとした時に、 jq とかをインストールして使ってたりすることが多いです。
でも、 jq ってLinux標準のコマンドじゃないしわざわざインストールしないといけなかったりして、
そのためだけにAMI作ったりしないといけないなんて事になると非常に面倒くさかったりします。
そこで --query オプション!
はい、そういうわけで、ほぼすべてのAWS CLIに利用できる標準オプションの --query を利用して、
ほとんど jq と遜色ない程度のフィルタリングを実現しちゃいましょう!
メリット
まず最初にこれを使うことのメリットとして、
- AWSコマンドが使えるならインストール等不要で必ず使える。
- ので、独自にAMIとか作る必要もない。
- AWS CLIの
--outputがjsonでなくともちゃんとフィルタリングできる。
などなど、上記の欠点をすべて解消しちゃいます!![]()
実際の使い方
基本的には --query に続いてクエリ文字列をJMESPath1でつけるだけです。
例えばElasticBeanstalkのAutoScalingGroup名から、そのASGにぶら下がっているインスタンスの一覧をスペース区切りで出力させるには以下のようにします。
aws --output text autoscaling describe-auto-scaling-instances \
--query 'AutoScalingInstances[?AutoScalingGroupName==`awseb-e-hogehoge-stack-AWSEBAutoScalingGroup-FUGAFUGA`].InstanceId'
上記で、 awseb-e-hogehoge-stack-AWSEBAutoScalingGroup-FUGAFUGA という名前のAutoScalingGroupにぶら下がっているすべてのインスタンスをスペース区切りで出力する という意味になります。
どうしてスペース区切りで取れるのかというと、AWS CLIのオプションに --output text を指定しているからです。
こうしておくと、このコマンドの戻り値をシェルの配列として直接変数定義することができちゃいます!
--output text をつけた時点で、返ってくるフォーマットがTSV形式になってしまうので
jq では処理できず、こんなに簡単にはいきませんよね![]()
デメリット
一方で以下のような若干のデメリットを感じる部分もあります。
- JMESPath自体があまり浸透していない(そして結構慣れるまで大変)
- 1度のリクエストの結果(Response)を使いまわしていろんな情報を取得することができない(同じクエリで都度通信しなければならない)
特に2つ目はかなり手間の面では大きいので、こういった場合にはローカルで動く jq コマンドの方が向いていると言えます。
1つ目のJMESPathがあまり浸透していない件は、まぁ公式ドキュメントやチュートリアルも充実しているので、
ちょっと勉強すればなんとかなる反面ハマりどころも多いのと、
jq 使いにはちょっと勝手が違う事もあうので jq に慣れちゃってると最初は戸惑うかもしれないといった程度でしょうか。
最後に
やはりどのコマンドでも準備なしで使えて出力フォーマットを自分で調節できる --query オプションは優秀だと思うので、
jq 使う前にまずは一度どちらがいいのか考えてみると良いかもしれませんね!
--query オプション、オススメです!![]()
※ 以前は --query がサーバサイドで処理されると思っていましたが普通にaws-cliがデータを受け取ってから処理していたようでしたので、記事を訂正しました。
-
詳しくは 【個人メモ】JSONのパースにjmespathを使ってみよう - Qiita を参照 ↩