AWS CLIで所望のEC2インスタンスを探す方法

# はじめに

* AWS上で多数の仮想マシン（EC2）を起動していると、どのような仮想マシンが存在し、どのような状態なのかがパッと分からないことがあります。
* そこで今回は、AWS CLIを使って仮想マシンの一覧を取得した後、リストを絞り込んで所望のインスタンスを探す方法をまとめてみました。

# 前提条件

* 以下のページの内容に沿って、AWS CLIの初期設定が行われていることが前提となります。
 * 出力フォーマットは「JSON」としています。

https://qiita.com/nkojima/items/19e4a098aaf9205115c0


# 基本のコマンド

* [AWSの公式リファレンス](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-instances.html#listing-instances)にも書かれているように、`aws ec2 describe-instances`というコマンドを使えばEC2インスタンスの一覧を取得できます。

```shell-session:実行するコマンド
[nkojima@akagi ~]$ aws ec2 describe-instances
```

* ただし、得られる結果が以下のようにかなり大きなサイズのJSONファイルなので、これをDLして人手で解析するのは得策ではありません...

```json:結果のJSONファイルの一例
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0123456789abc",
                    "InstanceId": "i-abcdefghijklmn012345",
                    "InstanceType": "t3a.nano",
                    "KeyName": "xxxxxxx",
                    "LaunchTime": "2021-03-04T01:19:42+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-10-0-1-102.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "10.0.1.102",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "PublicIpAddress": "xxx.xxx.xxx.xxx",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
...
```

## 仮想マシンのサマリーを一覧表示する方法

* [こちらのページ](https://blog.serverworks.co.jp/aws-cli-ec2)にも書かれているように、`--query`というパラメーターを付けることで出力される項目を絞り込むことができます。
  * ここでは仮想マシン名、Public IP、ステータスの3つを出力しています。
* インスタンス名の付いたタグを取得するため、`Tags[?Key=='Name']`という部分でフィルタリングしています。
* さらに`--output text`というパラメーターを付けることで、見やすい表形式で出力しています。
  * このパラメーターを付けないと、上記のようにJSONのまま出力されます。
  * 罫線付きの表形式にする場合は、`--output table`というパラメーターを使います。

```shell-session:実行するコマンド
[nkojima@akagi ~]$ aws ec2 describe-instances \
 --query "Reservations[].Instances[].[Tags[?Key=='Name'] | [0].Value,PublicIpAddress,State.Name]" \
 --output text 
```

```text:出力結果
nkojima-web     xxx.xxx.xxx.xxx  running
nkojima-test    xxx.xxx.xxx.xxx    running
test-server1    None    stopping
```

## 条件に合致する仮想マシンを一覧表示する方法

* `--filters`というパラメーターを付けることで、出力されるレコード（仮想マシン）を絞り込むことができます。
  * ここではステータスが実行中（running）の仮想マシンに絞った上で、仮想マシン名、Public IP、ステータスの3つを出力しています。
* 絞り込み条件として使用している`instance-state-name`などの名称は、[Optionsの一覧](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options)をご覧下さい。

```shell-session:実行するコマンド
aws ec2 describe-instances \
 --filters "Name=instance-state-name,Values=running" \
 --query "Reservations[].Instances[].[Tags[?Key=='Name'] | [0].Value,PublicIpAddress,State.Name]" \
 --output text
```

```text:出力結果
nkojima-web     xxx.xxx.xxx.xxx  running
nkojima-test    xxx.xxx.xxx.xxx    running
```

## 複数の条件に合致する仮想マシンを一覧表示する方法

* `--filters`パラメーターを複数使うことで、複数の条件に合致したレコード（仮想マシン）に絞り込むことができます。
  * ここではステータスが実行中（running）の仮想マシンで、なおかつインスタンス名が「web」と部分一致する仮想マシンに絞った上で、仮想マシン名、Public IP、ステータスの3つを出力しています。
  * [AWSのリファレンス](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)には書かれていませんでしたが、`Values=*web*`というように「*」でワイルドカードを指定することが出来るようです。
* 絞り込み条件として使用している`instance-state-name`などの名称は、[Optionsの一覧]

```shell-session:実行するコマンド
aws ec2 describe-instances \
 --filters "Name=instance-state-name,Values=running"\
 --filters "Name=tag:Name,Values=*web*"\
 --query "Reservations[].Instances[].[Tags[?Key=='Name'] | [0].Value,PublicIpAddress,State.Name]"\
 --output text
```

```text:出力結果
nkojima-web     xxx.xxx.xxx.xxx  running
```

# 参考URL

* [インスタンスの一覧表示 - Amazon EC2 インスタンスの起動、一覧表示、および終了](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-instances.html#listing-instances)
* [【AWS CLI】EC2のリソース情報取得編](https://blog.serverworks.co.jp/aws-cli-ec2)
* [AWS CLI 出力をフィルタリングする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html)
* [describe-instances - AWS CLI Command Reference](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)