ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

AWS CLI:--queryオプションの使い方

queryオプションの指定方法を何度やっても忘れるため、自分用のメモ書き+根本の仕組みを覚えたくて自分の環境で検証してみました。
基本構文とかも読み解こうと思ったのですが学習効率が良くなかったため、VPCの出力とそれに対するサンプルコマンドを用意してみました。
※個人検証のメモのため使用に責任は持てないため、参考程度で利用してください。

  • 検証日: 2021/03/31
  • PC環境:
    • Windows10
    • aws-cli/2.1.3 Python/3.7.7 Windows/10 exe/AMD64
    • コマンド実行はPowerShell(7.0.3)
      • コマンドの出力は行数を減らしたいのでyamlで出力します。

目次


1. --queryオプションとは

  • AWS CLIの出力する項目を絞り込む
  • クエリーの指定はJMESPath(ジェームズパス)というクエリ言語を使う
  • 項目名はコマンド出力で出たものをそのまま使う。--filtersと異なる。
    • filtersはケバブケース(例: cidr-block)
    • queryはキャメルケース(例: CidrBlock)
  • queryオプションの書き方は、JSON出力に合わせたもの。
  • JSONのリストや辞書を理解していれば、出力(--output)はJSONの方が解りやすい。


2. 検証を行うVPC

AWS CLIコマンドでVPC環境を表示。試験用に作成したVPCのみの状態。

aws ec2 describe-vpcs

Vpcs:
- CidrBlock: 10.1.0.0/16
  CidrBlockAssociationSet:
  - AssociationId: vpc-cidr-assoc-0642f45668e7b1208
    CidrBlock: 10.1.0.0/16
    CidrBlockState:
      State: associated
  DhcpOptionsId: dopt-fdc2fb9a
  InstanceTenancy: default
  IsDefault: false
  OwnerId: '176061804310'
  State: available
  Tags:
  - Key: System
    Value: Test
  - Key: Name
    Value: Test-Vpc
  VpcId: vpc-09ff13fba3e354e62


3. --queryオプションのサンプルコマンド

色々なパターンのサンプルコマンドです。すべて有効な書式です。

aws ec2 describe-vpcs 
aws ec2 describe-vpcs --query "Vpcs[]"
aws ec2 describe-vpcs --query "Vpcs[0]"
aws ec2 describe-vpcs --query "Vpcs[1]"
aws ec2 describe-vpcs --query "Vpcs[0:2]"
aws ec2 describe-vpcs --query "Vpcs[].VpcId"
aws ec2 describe-vpcs --query "Vpcs[].CidrBlock"
aws ec2 describe-vpcs --query "Vpcs[].[VpcId,CidrBlock]"
aws ec2 describe-vpcs --query "Vpcs[].[CidrBlock,VpcId]"
aws ec2 describe-vpcs --query "Vpcs[].{vpc:VpcId,cidr:CidrBlock}"
aws ec2 describe-vpcs --query "Vpcs[].CidrBlockAssociationSet[]"
aws ec2 describe-vpcs --query "Vpcs[].CidrBlockAssociationSet[].CidrBlock"
aws ec2 describe-vpcs --query "Vpcs[].CidrBlockAssociationSet[].CidrBlockState"
aws ec2 describe-vpcs --query "Vpcs[].Tags[]"
aws ec2 describe-vpcs --query "Vpcs[].Tags[*]"
    # ↑[*]とすることでフラット化が解除され、機器毎の設定がわかる。
aws ec2 describe-vpcs --query "Vpcs[].Tags[].Value"
aws ec2 describe-vpcs --query "Vpcs[].Tags[].[Key,Value]"
aws ec2 describe-vpcs --query "Vpcs[].Tags[].{NinniMoji_1:Key, NinniMoji_2:Value}"
    # ↑値の前に任意の文字列を付与する
aws ec2 describe-vpcs --query "Vpcs[].Tags[?Key=='Name'].Value[]"
aws ec2 describe-vpcs --query "Vpcs[].Tags[?Key=='Name'].{NinniMoji_1:Key, NinniMoji_2:Value}[]"
aws ec2 describe-vpcs --query "Vpcs[].[Tags[],VpcId]"
aws ec2 describe-vpcs --query "Vpcs[].[Tags[?Key=='Name'].Value[],VpcId]"
aws ec2 describe-vpcs --query "Vpcs[?State=='available'].VpcId"
aws ec2 describe-vpcs --query "Vpcs[?State=='available'].VpcId"
    # ↑式の比較演算子には、==、!=、<、<=、>、>= などがある


4. queryを作るのが面倒ならfindstrを使う(Linuxならgrep)

AWS CLIを使っててクエリ文を考えるのが面倒な時があります。
単純に「〇〇の文字列が含まれる行」を抽出したい場合は、OS側でフィルターするのも有りだと思います。

# ▼ 「VpcId:」を含む行。
aws ec2 describe-vpcs | findstr VpcId:
>  VpcId: vpc-09ff13fba3e354e62

# ▼正規表現:「ネットワークアドレス」を含む行。
aws ec2 describe-vpcs | findstr [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\/
>- CidrBlock: 10.1.0.0/16
>    CidrBlock: 10.1.0.0/16

# ▼ AND検索:「CidrBlock:」 and 「16」を含む行。
aws ec2 describe-vpcs | findstr CidrBlock: | findstr 16
>- CidrBlock: 10.1.0.0/16
>    CidrBlock: 10.1.0.0/16

# ▼ OR検索:「CidrBlock:」 or 「VpcId:」を含む行。
aws ec2 describe-vpcs | findstr /V "CidrBlock: VpcId:"
>- CidrBlock: 10.1.0.0/16
>    CidrBlock: 10.1.0.0/16
>  VpcId: vpc-09ff13fba3e354e62

# ▼ NOT検索:「-」を含まない行。
aws ec2 describe-vpcs | findstr /V \-
>Vpcs:
>  CidrBlockAssociationSet:
>    CidrBlock: 10.1.0.0/16
>    CidrBlockState:
>      State: associated
>  InstanceTenancy: default
>  IsDefault: false
>  OwnerId: '176061804310'
>  State: available
>  Tags:
>    Value: Test