@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

AWS CLIの出力でタグの中からNameタグだけを残す

AWS CLIの出力をjqコマンドで整形したり、必要な部分だけ抜き出すときにタグ情報が厄介。

ちょっと調べて、いい感じにNameタグだけを抜き出す記述を見つけたのでメモ。

.Tags[]? | select( .Key=="Name") | .Value

何が厄介なのか

aws cliの出力が以下のようになっていて

{
  "Addresses": [
    {
      "PublicIp": "123.123.123.123",
      "AllocationId": "eipalloc-12345",
      ...
      "Tags": [
        {
          "Key": "Name",
          "Value": "EIP-NATGW",
        },
        {
          "Key": "CostCenter",
          "Value": "ABC",
        }
      ]
    },
    ...
  ]
}

こんな出力にしたいときにタグ情報からNameだけを抜き出すのが面倒。

    {
      "PublicIp": "123.123.123.123",
      "AllocationId": "eipalloc-12345",
      ...
      "Name": "EIP-NATGW",
    },
    ...

他にもCSVにするためにこのように出力したいこともある。

"123.123.123.123","eipalloc-12345","EIP-NATGW"
...

解説

.Tags[]? # Tags配列を抜き出して(なければ無視する)
  | select( .Key=="Name") # 抜き出したオブジェクトのうちキーKeyがNameのものだけに絞り込み
  | .Value # 絞り込まれたオブジェクトのキーValueだけを返す

上記の例を実際にやってみるとこんな感じ。

$ aws ec2 describe-addresses \
  | jq '.Addresses[] | {PublicIp, AllocationId, Name: (.Tags[]? | select( .Key=="Name") | .Value)}'
{
  "PublicIp": "123.123.123.123",
  "AllocationId": "eipalloc-12345",
  "Name": "EIP-NATGW"
}
$  aws ec2 describe-addresses \
  | jq -r '.Addresses[] | [.PublicIp, .AllocationId, (.Tags[]? | select( .Key=="Name") | .Value)] | @csv'
"123.123.123.123","eipalloc-12345","EIP-NATGW"

参考

aws cli + jq example · GitHub