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
の下には、Code
と Name
があるようです。
必要なのは、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