Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
111
Help us understand the problem. What is going on with this article?
@draco

AWS CLI の query による絞り込み

More than 5 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
111
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
draco

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
111
Help us understand the problem. What is going on with this article?