0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

aws-cliのec2 describe-instancesでいい感じに情報を取得できるquery(JMES-Path)を考えてみる

Posted at

aws-cliの出力結果をいい感じに整形できる--queryオプションですが、本記事ではEC2インスタンス情報から一般的?かと思われる情報を出力するクエリ(JMES-Path)について考えてみます。

ec2 describe-instancesで取得できる項目を選択する

aws ec2 describe-instances / output

ec2 describe-instancesコマンドは様々な情報が取得できますが、出力される構造については上記ドキュメントに記載があります。

今回は下記の一覧を出力したかったのでこちらを取得するようなJMES-Pathについて考えます。

  • InstanceId
  • Nameタグ
  • _Descriptionタグ(任意設定したタグ)
  • InstanceType
  • AvailabilityZone
  • EnaSupport
  • Platform
  • VirtualizationType
  • PIP(PrivateIP)
  • Tenancy

これを取得できるように書いてみると下記のようになります。

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].{InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value|[0],_Description:Tags[?Key==`_Description`].Value|[0],InstanceType:InstanceType,AvailabilityZone:Placement.AvailabilityZone,EnaSupport:EnaSupport,Platform:Platform,VirtualizationType:VirtualizationType,PIP:NetworkInterfaces[].PrivateIpAddress[]| join(`,`,@),Tenancy:Placement.Tenancy} | sort_by(@, &Name)'

## どんな情報が取得できるか確認します

image.png

上記のようにタグ登録されているインスタンスからは下記のような情報が取得できます。

image.png

JMEA-Pathでやってることを分解

'Reservations[].Instances[].{InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value|[0],_Description:Tags[?Key==`_Description`].Value|[0],InstanceType:InstanceType,AvailabilityZone:Placement.AvailabilityZone,EnaSupport:EnaSupport,Platform:Platform,VirtualizationType:VirtualizationType,PIP:NetworkInterfaces[].PrivateIpAddress[]| join(`,`,@),Tenancy:Placement.Tenancy} | sort_by(@, &Name)

上記ではごちゃごちゃして長いので分解して考えてみます。

  • Reservations[].Instances[]

ec2 describe-instanceの情報はReservationsリストの中のInstancesリストに含まれるのでこれを展開します。

Instancesリストから情報を取得

Instancesリストにある項目を取得

JMES-Pathでは[項目名1]といった指定の他に{別名:項目1}といった指定ができるので今回はこちらの別名をつけられる方法で指定している。

exsample
Reservations[].Instances[].{別名1:項目名1,別名2,項目名2}

下記項目についてはもともとの項目名のまま取得している

  • InstanceId:InstanceId
  • InstanceType:InstanceType
  • EnaSupport:EnaSupport
  • Platform:Platform
  • VirtualizationType:VirtualizationType

Tagsリストから情報を取得

Instancesリストの中のTagsリストにタグ情報は格納されている。

今回、標準タグのNameタグと任意登録した_Descriptionというタグを出力したかたので下記のようにタグ値をJMES-Pathで展開しててタグ値を取得する。

  • Name:Tags[?Key==Name].Value|[0]

NameタグはInstancesの中のTagsリストに含まれるので、Key項目のNameでフィルタして取得できたValueをNameという項目名で取得

  • _Description:Tags[?Key==_Description].Value|[0]

任意で登録したタグ_Descriptionについても、Tagsリストに含まれるので、Nameタグと同様にKey項目を_DescriptionでフィルタしてValueを_Descriptionという項目名で取得

Placement構造からAvailabilityZoneとTenancyを取得

  • AvailabilityZone:Placement.AvailabilityZone
  • Tenancy:Placement.Tenancy

AZとテナンシーはPlacement構造に含まれるため下記のように展開

Placement.項目名 だと長いのでそれぞれ、AvailabilityZone,Tenancyの項目名で取得

NetworkInterfacesリストからPrivateIPを取得

  • PIP:NetworkInterfaces[].PrivateIpAddress[]| join(,,@)

PrivateIPはNetworkInterfacesのリストに含まれており、NICが複数枚ささっている場合は複数取得できるため、PrivateIPAddressを取得してカンマ区切りでJoinして項目名PIPで取得

総評

--queryオプションをさわりはじめた時は、どうやってタグ情報を出力するの? だったり色々と疑問がわきますが。

examples

コマンドドキュメントのexamples

Example 10: To filter instances of the specified type and only display their instance IDs, Availability Zone and the specified tag value in table format

というそのものズバリがサンプルが用意されていて。

よくある疑問が解消されるよくできたドキュメントだなと感じます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?