BLOGサブスレッドの日常

2020.07.16

aws-cliでEC2一覧を表示する

chao

はじめに

aws-cli でEC2のインスタンス一覧を出力したいという事があると思います。
ついでにIPアドレスやNameタグもくっつけたり。

今回は、そんなEC2のインスタンス一覧を行うコマンドの紹介と説明をします。

コマンド

まず、いきなりゴールのコマンドです。

  • インスタンスID
  • グローバルIPアドレス
  • Nameタグ(AWSコンソール上にて、EC2に対して自由につけられる名前)
  • インスタンスの状態

を一覧するコマンドが以下になります。

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{id:InstanceId,name:Tags[?Key==`Name`].Value|[0]}'
------------------------------------------------------------------------
|                           DescribeInstances                          |
+---------------------+------------------+------------------+----------+
|         id          |     ipaddr       |      name        |  state   |
+---------------------+------------------+------------------+----------+
|  i-xxxxxxxx         |  xx.xx.xx.xx     |  名無しのEC2 1    |  running |
|  i-xxxxxxxx         |  xx.xx.xx.xx     |  名無しのEC2 1    |  running |
+---------------------+------------------+------------------+----------+

コマンドの説明

--query オプションにて、各状況を取得しています。
まずは一つずつ情報を取得してみましょう。

インスタンスIDの取得

query にて、Reservations[].Instances[].InstanceId を指定することでインスタンスIDを取得できます。

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].InstanceId'
-------------------------
|   DescribeInstances   |
+-----------------------+
|  i-xxxxxxxx           |
|  i-xxxxxxxx           |
+-----------------------+

グローバルIPアドレスの取得

query にて、Reservations[].Instances[].PublicIpAddress を指定することでグローバルIPアドレスを取得できます。

aws ec2 describe-instances --query 'Reservations[].Instances[].PublicIpAddress'
--------------------
| DescribeInstances|
+------------------+
|  xx.xx.xx.xx     |
|  xx.xx.xx.xx     |
+------------------+

ステータスの取得

Reservations[].Instances[].State にインスタンスの状態があります。

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].State'
---------------------
| DescribeInstances |
+-------+-----------+
| Code  |   Name    |
+-------+-----------+
|  16   |  running  |
|  16   |  running  |
+-------+-----------+

State の下には、CodeName があるようです。
必要なのは、Name の方なので、Name を追加して、Reservations[].Instances[].State.Name にしましょう。

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].State.Name'
-------------------
|DescribeInstances|
+-----------------+
|  running        |
|  running        |
+-----------------+

うまくいきました。

Nameタグの取得

Reservations[].Instances[].State にインスタンスの状態があります。

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].Tags[?Key==`Name`]'
----------------------------
|     DescribeInstances    |
+-------+------------------+
|  Key  |      Value       |
+-------+------------------+
|  Name |  名無しのEC2 1    |
|  Name |  名無しのEC2 2    |
+-------+------------------+
aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'
--------------------
| DescribeInstances|
+------------------+
|  名無しのEC2 1    |
|  名無しのEC2 2    |
+------------------+

全部つなげてみる

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{id:InstanceId,ipaddr:PublicIpAddress,state:State.Name,name:Tags[?Key==`Name`].Value}'
------------------------------------------------------
|                  DescribeInstances                 |
+----------------+--------------------+--------------+
|       id       |      ipaddr        |    state     |
+----------------+--------------------+--------------+
|  i-xxxxxxxx    |  xx.xx.xx.xx       |  running     |
+----------------+--------------------+--------------+
||                       name                       ||
|+--------------------------------------------------+|
||  名無しのEC2 1                                    ||
|+--------------------------------------------------+|
|                  DescribeInstances                 |
+----------------+---------------------+-------------+
|       id       |       ipaddr        |    state    |
+----------------+---------------------+-------------+
|  i-xxxxxxxx    |  xx.xx.xx.xx        |  running    |
+----------------+---------------------+-------------+
||                       name                       ||
|+--------------------------------------------------+|
||  名無しのEC2 2                                    ||
|+--------------------------------------------------+|

なんか name がおかしいので調べましょう。
query を name だけにして、output を json にしてみたところ、name は配列になっていることが分かりました。

aws ec2 describe-instances --output=json --query 'Reservations[].Instances[].{name:Tags[?Key==`Name`].Value}'
[
    {
        "name": [
            "名無しのEC2 1"
        ]
    },
    {
        "name": [
            "名無しのEC2 2"
        ]
    }
]

name(Nameタグ) の配列を展開する

ここが一番悩んだのですが、以下のように末尾に |[0] を入れると展開できることがわかりました。

aws ec2 describe-instances --output=json --query 'Reservations[].Instances[].{name:Tags[?Key==`Name`].Value|[0]}'
[
    {
        "name": "名無しのEC2 1"
    },
    {
        "name": "名無しのEC2 2"
    }
]

再度、全部つなげてみる

aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{id:InstanceId,ipaddr:PublicIpAddress,state:State.Name,name:Tags[?Key==`Name`].Value|[0]}'
------------------------------------------------------------------------
|                           DescribeInstances                          |
+---------------------+------------------+------------------+----------+
|         id          |     ipaddr       |      name        |  state   |
+---------------------+------------------+------------------+----------+
|  i-xxxxxxxx         |  xx.xx.xx.xx     |  名無しのEC2 1    |  running |
|  i-xxxxxxxx         |  xx.xx.xx.xx     |  名無しのEC2 1    |  running |
+---------------------+------------------+------------------+----------+

おめでとうございます。これで完成です!

この記事を書いた人

chao