Open10

今度こそ jq の構文を体で覚える

ymzksgkzymzksgkz

AWS を CLI で扱う時なにかと jq を使うけど、なんか構文がいまいち覚えられなくて
結局 AI にシチュエーションを提示してコードを出してもらう事が多い(我ながら雑魚い)

ので、インタラクティブに jq のコマンドを書きつつフィルタリングができる jnv で試行錯誤を繰り返してみる

jnv についてはこちらの記事が詳しそう
https://zenn.dev/kou_pg_0131/articles/jnv-introduction

$ brew install ynqa/tap/jnv
ymzksgkzymzksgkz

シチュエーション:DynamoDB のテーブル一覧から目的のテーブルをフィルタリングする

ymzksgkzymzksgkz

このくらいなら自力でなんとかなる

>>> aws dynamodb list-tables | jnv
❯❯ .TableNames[] | select(contains("hoge"))
"hoge-****************"
ymzksgkzymzksgkz

シチュエーション:EC2 のリストを取得。 Tags から Key: "Name" を取得、同時に InstanceId, LaunchTime を取得してリスト化する

Name InstanceId LaunchTime
Name InstanceId LaunchTime
Name InstanceId LaunchTime

みたいな感じで並べたい

ymzksgkzymzksgkz

自分で試行錯誤してみようかと思ったけど、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 ってなんだ。

ymzksgkzymzksgkz

AI によると、Tags が以下の様な構造になっているので、

"Tags": [
  {
    "Key": "Name",
    "Value": "MyEC2Instance"
  },
  {
    "Key": "Environment",
    "Value": "Production"
  }
]

.Tags[] | select(.Key == "Name") によって一致する要素が取得されて、

{
    "Key": "Name",
    "Value": "MyEC2Instance"
}

さらに .Value によって取得してきた Tag の Value == MyEC2Instance が取得できてる、という事っぽい。
なるほど。

ymzksgkzymzksgkz

シチュエーション:Lambda のリストを取得。FunctionName, Runtime, LastModified を取得してリスト化する

FunctionName, Runtime, LastModified
FunctionName, Runtime, LastModified
FunctionName, Runtime, LastModified

みたいな

ymzksgkzymzksgkz

EC2 の例を元に今度は自分でやってみる。

>>> aws lambda list-functions | jnv
❯❯ .Functions[] | [.FunctionName, .Runtime, .LastModified] | @csv

でいけた。これはちょっとイージー過ぎた。

Functions 直下には Environment が居て、さらにその下には Variables が存在しているので、それらを追加でリスト化してみる事にする。

レスポンスの参考)
https://docs.aws.amazon.com/cli/latest/reference/lambda/list-functions.html#examples

ymzksgkzymzksgkz

結果大体こんな感じになった

>>> 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

ymzksgkzymzksgkz

あと何ができたらいいかな
思いついたらまた追記する(シチュエーションゆるぼ)