Edited at

AWS CLI の query による絞り込み

More than 3 years have passed since last update.

aws ec2 describe-うんちゃら で必要な情報を取得した時のメモ。

主に↓を参照しつつ、Try&Errorの結果。

http://jmespath.readthedocs.org/en/latest/specification.html


絞り込み方

コマンドとしては以下の形式で絞り込む。--query の条件はシングルクォート'でないとエラーとなる。

$ aws ec2 describe-instances --query '条件'

この時、条件として設定する文字列は、以下のような感じで考えるとやり易いかもしれない。


  • JSONの階層構造を意識する

  • 表示項目を絞り込む

  • 表示対象を絞り込む

例えば aws ec2 describe-instances の実行結果を見ると、Reservations がトップレベルにあるのがわかる。

{

"Reservations": [
{
"OwnerId": "XXXXXXXXXXXX",
"ReservationId": "r-XXXXXXXX",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
:
:

なので、単純に Reservations 以下を表示させる場合は、

$ aws ec2 describe-instances --query 'Reservations[]'

とすることで、以下のように一階層下からの表示に絞り込める。

[

{
"OwnerId": "XXXXXXXXXXXX",
"ReservationId": "r-XXXXXXXX",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
:
:

さらに下の階層に絞る場合は . で繋げれば良い。

$ aws ec2 describe-instances --query 'Reservations[].Instances[]'

[
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": null,
"Platform": "windows",
"State": {
"Code": 80,
"Name": "stopped"
:
:

次に、表示対象を絞る場合、. で繋げた後に [] もしくは {} で囲った中に表示対象を記載すれば良い。

[] の場合は配列表示、{} の場合はハッシュ表示となる。


配列時

$ aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId]'

[
[
"i-AAAAAAAA"
],
[
"i-BBBBBBBB"
],
[
"i-CCCCCCCC"
],
:
:

ハッシュ時は任意のKeyを追加する必要がある。指定しないとエラー。


ハッシュ時

$ aws ec2 describe-instances --query 'Reservations[].Instances[].{ID:InstanceId}'

[
{
"ID": "i-AAAAAAAA"
},
{
"ID": "i-BBBBBBBB"
},
{
"ID": "i-CCCCCCCC"
},:
:

ただ、このままだと全てのインスタンスが対象となるので、そこで絞り込みが必要となる。

表示階層を指定している [] 内にその配下にある項目に対して条件を [?項目名==`値`] という形式で記載する。値をバッククォートで囲うのが要注意。

$ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceId==`i-AAAAAAAA`].[InstanceId]'

[
[
[
"i-AAAAAAAA"
]
],
[],
[],
[],
[],
:
:

しかし、空要素も表示されてしまうため、表示部分の末尾に [] を追加することで空要素を非表示にできる。

なぜ、[] で良いのかは不明。。。一階層下がることで空は消えるのか?

$ aws ec2 describe-instances --query 'Reservations[].Instances[?InstanceId==`i-AAAAAAAA `].[InstanceId][]'

[
[
"i-AAAAAAAA"
]
]

基本的には今までの考え方を組み合わせていくのみ。

応用的に色々あるみたいだが、Try&Errorの結果ベースなので説明は無理。。。


実行例

以下は簡単なシナリオ想定での例。


Tag名からインスタンス情報を取得したい

おそらくは、サーバホスト名=Tag名という設計が多いはず。

$ aws ec2 describe-instances --query 'Reservations[].Instances[?Tags[?Key==`Name`].Value|[0]==`TAG_NAME`][]|[0]'

Tag名からInstanceIdのみ取得する場合。

aws ec2 describe-instances --query 'Reservations[].Instances[?Tags[?Key==`Name`].Value|[0]==`TAG_NAME`][].[InstanceId][]|[0]'


インスタンス一覧が見たい

サマリ的な情報を見たいときとか。IPやらタグ名やら状態やら。

aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[?Key==`Name`].Value|[0],InstanceType:InstanceType,State:State.Name,Ip:PrivateIpAddress,AZ:Placement.AvailabilityZone,Platform:Platform},&Tags)' --output table                       |


サブネットの一覧を見たい

どのAZにどんなサブネットがあって、そのIDとかちょっと見たいなぁという時に。

aws ec2 describe-subnets --query 'Subnets[].{VpcId:VpcId,Cidr:CidrBlock,AZ:AvailabilityZone,SubnetId:SubnetId,Tags:Tags[?Key==`Name`].Value|[0]}' --output table

AZ順にソートもできる。

aws ec2 describe-subnets --query 'sort_by(Subnets[].{VpcId:VpcId,Cidr:CidrBlock,AZ:AvailabilityZone,SubnetId:SubnetId,Tags:Tags[?Key==`Name`].Value|[0]},&AZ)' --output table