AWS CLIを使ってEC2インスタンス一覧を取得する

# 事前準備

1. クライアントにAWS CLIを設定  
AWS CLIの設定方法は[こちら](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)  
「aws configure」で必要なアクセスキーの作成は[こちら](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey)

## 取得項目

- InstanceId: EC2インスタンスID
- PrivateIp: プライベートIP。複数ネットワークインターフェース(以降、NIC)付与していてもカンマ区切りで一覧表示される。  
(※セカンダリIPアドレスは表示されません)
- GlobalIP: パブリック IP。複数NIC付与していてもカンマ区切りで一覧表示される。
- Platform: OS。Linuxの場合は『None』、windowsの場合は『windows』と表示される。
- State: ステータス。
- SecurityGroupId: セキュリティグループID一覧。複数個付与していてもカンマ区切りで一覧表示される。
- Name: 『Name』タグの値を表示。

# EC2インスタンス一覧を取得するコマンド

### 全EC2インスタンスの取得  

```bash:全EC2インスタンスの取得
$ aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{InstanceId: InstanceId, PrivateIp: join(`, `, NetworkInterfaces[].PrivateIpAddress), GlobalIP: join(`, `, NetworkInterfaces[].Association.PublicIp), Platform:Platform, State: State.Name, SecurityGroupId: join(`, `, SecurityGroups[].GroupId) ,Name: Tags[?Key==`Name`].Value|[0]}'
```

```bash:例）全EC2インスタンスの取得の結果
----------------------------------------------------------------------------------------------------------------------------------------------
|                                                              DescribeInstances                                                             |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|    GlobalIP    |     InstanceId       | Name  | Platform  |          PrivateIp           |           SecurityGroupId           |   State   |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|  52.0.0.10     |  i-0123456789abcdef1 |  ex1  |  None     |  172.31.10.10, 172.31.0.10   |  sg-01234567, sg-1123456789abcdef1  |  running  |
|  52.0.0.11     |  i-1123456789abcdef1 |  ex2  |  None     |  172.31.10.11, 172.31.0.11   |  sg-01234567, sg-1123456789abcdef1  |  stopped  |
|                |  i-2123456789abcdef1 |  ex3  |  None     |  172.31.1.10                 |  sg-01234567                        |  stopped  |
|                |  i-3123456789abcdef1 |  ex4  |  windows  |  172.31.11.10                |  sg-1123456789abcdef1               |  stopped  |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
```

### windowsのEC2インスタンスの取得

```bash:windowsのEC2インスタンスの取得
$ aws ec2 describe-instances --output=table --query 'Reservations[].Instances[?Platform==`windows`][].{InstanceId: InstanceId, PrivateIp: join(`, `, NetworkInterfaces[].PrivateIpAddress), GlobalIP: join(`, `, NetworkInterfaces[].Association.PublicIp), Platform:Platform, State: State.Name, SecurityGroupId: join(`, `, SecurityGroups[].GroupId) ,Name: Tags[?Key==`Name`].Value|[0]}'
```

```bash:例）windowsのEC2インスタンスの取得の結果
-------------------------------------------------------------------------------------------------------------
|                                             DescribeInstances                                             |
+----------+----------------------+-------+-----------+----------------+------------------------+-----------+
| GlobalIP |     InstanceId       | Name  | Platform  |   PrivateIp    |    SecurityGroupId     |   State   |
+----------+----------------------+-------+-----------+----------------+------------------------+-----------+
|          |  i-3123456789abcdef1 |  ex4  |  windows  |  172.31.11.10  |  sg-1123456789abcdef1  |  stopped  |
+----------+----------------------+-------+-----------+----------------+------------------------+-----------+
```

### LinuxのEC2インスタンスの取得

```bash:LinuxのEC2インスタンスの取得
aws ec2 describe-instances --output=table --query 'Reservations[].Instances[?Platform!=`windows`][].{InstanceId: InstanceId, PrivateIp: join(`, `, NetworkInterfaces[].PrivateIpAddress), GlobalIP: join(`, `, NetworkInterfaces[].Association.PublicIp), Platform:Platform, State: State.Name, SecurityGroupId: join(`, `, SecurityGroups[].GroupId) ,Name: Tags[?Key==`Name`].Value|[0]}'
```

```bash:例）LinuxのEC2インスタンスの取得の結果
----------------------------------------------------------------------------------------------------------------------------------------------
|                                                              DescribeInstances                                                             |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|    GlobalIP    |     InstanceId       | Name  | Platform  |          PrivateIp           |           SecurityGroupId           |   State   |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|  52.0.0.10     |  i-0123456789abcdef1 |  ex1  |  None     |  172.31.10.10, 172.31.0.10   |  sg-01234567, sg-1123456789abcdef1  |  running  |
|  52.0.0.11     |  i-1123456789abcdef1 |  ex2  |  None     |  172.31.10.11, 172.31.0.11   |  sg-01234567, sg-1123456789abcdef1  |  stopped  |
|                |  i-2123456789abcdef1 |  ex3  |  None     |  172.31.1.10                 |  sg-01234567                        |  stopped  |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
```

### タグ検索してEC2インスタンスを取得

```bash:例）タグ『product：sample』の場合
aws ec2 describe-instances --output=table --query 'Reservations[].Instances[?Tags[?Key==`product`].Value|[0]==`sample`][].{InstanceId: InstanceId, PrivateIp: join(`, `, NetworkInterfaces[].PrivateIpAddress), GlobalIP: join(`, `, NetworkInterfaces[].Association.PublicIp), Platform:Platform, State: State.Name, SecurityGroupId: join(`, `, SecurityGroups[].GroupId) ,Name: Tags[?Key==`Name`].Value|[0]}'
```

```bash:例）タグ『product：sample』の場合の結果
----------------------------------------------------------------------------------------------------------------------------------------------
|                                                              DescribeInstances                                                             |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|    GlobalIP    |     InstanceId       | Name  | Platform  |          PrivateIp           |           SecurityGroupId           |   State   |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
|  52.0.0.10     |  i-0123456789abcdef1 |  ex1  |  None     |  172.31.10.10, 172.31.0.10   |  sg-01234567, sg-1123456789abcdef1  |  running  |
|  52.0.0.11     |  i-1123456789abcdef1 |  ex2  |  None     |  172.31.10.11, 172.31.0.11   |  sg-01234567, sg-1123456789abcdef1  |  stopped  |
+----------------+----------------------+-------+-----------+------------------------------+-------------------------------------+-----------+
```

# 参考資料

- [How to Filter the Output with the --query Option](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/controlling-output.html#controlling-output-filter)
- [AWS CLI Command Reference aws ec2 describe-instances](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)