今度こそ jq の構文を体で覚える
AWS を CLI で扱う時なにかと jq を使うけど、なんか構文がいまいち覚えられなくて
結局 AI にシチュエーションを提示してコードを出してもらう事が多い(我ながら雑魚い)
ので、インタラクティブに jq のコマンドを書きつつフィルタリングができる jnv で試行錯誤を繰り返してみる
jnv についてはこちらの記事が詳しそう
$ brew install ynqa/tap/jnv
シチュエーション:DynamoDB のテーブル一覧から目的のテーブルをフィルタリングする
このくらいなら自力でなんとかなる
>>> aws dynamodb list-tables | jnv
❯❯ .TableNames[] | select(contains("hoge"))
"hoge-****************"
シチュエーション:EC2 のリストを取得。 Tags から Key: "Name" を取得、同時に InstanceId, LaunchTime を取得してリスト化する
Name InstanceId LaunchTime
Name InstanceId LaunchTime
Name InstanceId LaunchTime
みたいな感じで並べたい
自分で試行錯誤してみようかと思ったけど、AI が答えを持ってるなら答えから理屈を学んだ方が良い気がしたのでまずは AI の答え。
.Reservations[].Instances[] | [(.Tags[] | select(.Key == "Name").Value), .InstanceId, .LaunchTime] | @csv
目的の情報は表示できたっぽいので、わかる事とわからない事を切り分けていく。
わかる事
-
.Reservations[].Instances[] |
ここはわかる。root の Reservations(配列)Instances(配列)まで階層を掘っている - その後のパイプと、その後ろ全体を囲っている [] もわかる。配列にしてさらにその後ろの @csv で csv 形式で出力しようとしている(多分)
- .InstanceId, .LaunchTime もわかる。
(.Tags[] | select(.Key == "Name").Value)
については、Instances[] 配下に各インスタンスの情報が入ってきてるので、さらに .Tags[] で Tags(配列)の階層を掘って、select() 関数で Key が Name なタグを抽出している。- 全体を() でくくってるのはパイプで深堀りしてるからだと思う。
わからない事
select(.Key == "Name").Value
ここの .Value ってなんだ。
AI によると、Tags が以下の様な構造になっているので、
"Tags": [
{
"Key": "Name",
"Value": "MyEC2Instance"
},
{
"Key": "Environment",
"Value": "Production"
}
]
.Tags[] | select(.Key == "Name")
によって一致する要素が取得されて、
{
"Key": "Name",
"Value": "MyEC2Instance"
}
さらに .Value によって取得してきた Tag の Value == MyEC2Instance が取得できてる、という事っぽい。
なるほど。
シチュエーション:Lambda のリストを取得。FunctionName, Runtime, LastModified を取得してリスト化する
FunctionName, Runtime, LastModified
FunctionName, Runtime, LastModified
FunctionName, Runtime, LastModified
みたいな
EC2 の例を元に今度は自分でやってみる。
>>> aws lambda list-functions | jnv
❯❯ .Functions[] | [.FunctionName, .Runtime, .LastModified] | @csv
でいけた。これはちょっとイージー過ぎた。
Functions 直下には Environment が居て、さらにその下には Variables が存在しているので、それらを追加でリスト化してみる事にする。
レスポンスの参考)
結果大体こんな感じになった
>>> aws lambda list-functions | jnv
❯❯ .Functions[] | [.FunctionName, .Runtime, .LastModified, (.Environment.Variables | to_entries | map("\(.key):\t\(.value)") )]
[
"hogehoge-fugafuga-function",
"nodejs20.x",
"2024-10-01T00:00:00.000+0000",
[
"HOGEHOGE_FUGAFUGA: ********************************",
]
]
to_entries | map("\(.key):\t\(.value)")
このあたりがまるっと思いつかなかった。
てか知らなかった。見たことはあるかもしれないけど覚えてなかった。
知るべき事が見つかった。ラッキー。
to_entries
map
あと何ができたらいいかな
思いついたらまた追記する(シチュエーションゆるぼ)