AWS CLIのエイリアス機能を使用してEC2を簡単に操作する方法

# はじめに
AWS CLIは便利なのですが、覚えるコマンドが長かったり、デフォルトで表示される情報が多すぎたりする印象です。
そのため、Terraform等を利用してせっかくコマンド操作をメインにして作業の効率化をしているのに、結局EC2の状態確認や電源操作するだけでもマネジメントコンソール(GUI)を見る機会が多くなったりしていました。
EC2の簡単な操作くらいは何も見ることなくコマンドから実施したいと思い、方法を検討した結果を記載します。

# 環境

- OS: macOS Monterey 12.3.1
- AWS CLI: 2.5.4

# AWS CLIエイリアス機能を利用して簡易コマンドを作成する

AWS CLIにはエイリアス機能があり、独自コマンドを登録できるため、それを利用します。
(AWS CLI自体は実行できるようにインストール済みとします。)

設定は簡単で、以下のようにaliasファイルを作成するだけです。

```
% mkdir -p ~/.aws/cli
% vi ~/.aws/cli/alias
```

今回私は以下のように追加してみました。
[GitHub](https://github.com/inayuky/awscli-aliases)にも登録しています。

```
[toplevel]

ec2-list = ec2 describe-instances \
    --output table \
    --query 'Reservations[].Instances[].{ID: InstanceId, Name: Tags[?Key==`Name`].Value | [0], PublicIP: PublicIpAddress, State: State.Name, Type: InstanceType}'

ec2-start =
  !f() {
    aws ec2 start-instances --instance-ids i-"${1}"
  }; f

ec2-stop =
  !f() {
    aws ec2 stop-instances --instance-ids i-"${1}"
  }; f

ec2-show =
  !f() {
    aws ec2 describe-instances --instance-ids i-"${1}"
  }; f
```

以上の設定により、以下のように自分がよく参照する情報だけ抽出して見やすく表示し、簡単に電源操作ができるようになりました。
これなら忘れることもなく、コマンドだけで操作を完結できそうです。

# インスタンス一覧表示

インスタンスID、インスタンス名、パブリックIP(EIP含む)、電源状態、インスタンスタイプが表示されます。

```
inayuky ~ % aws ec2-list
---------------------------------------------------------------------------------------
|                                  DescribeInstances                                  |
+----------------------+-------------------+-----------------+----------+-------------+
|          ID          |       Name        |    PublicIP     |  State   |    Type     |
+----------------------+-------------------+-----------------+----------+-------------+
|  i-0967ac2416c675bbc |  None             |  None           |  stopped |  t2.medium  |
|  i-0ec844c8f250dc055 |  sample2          |  18.182.142.129 |  stopped |  t3.micro   |
|  i-077ed543385b9cb86 |  sample1          |  None           |  stopped |  t3.micro   |
+----------------------+-------------------+-----------------+----------+-------------+
```

# インスタンス起動

インスタンスIDの`i-`より後の英数字のみを指定して起動できます。
（インスタンスIDをコピペするときに`i-`の部分を選択するのが面倒なので、`i-`を自動で付加するようにしているため）


```
inayuky ~ % aws ec2-start 077ed543385b9cb86
{
    "StartingInstances": [
        {
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "InstanceId": "i-077ed543385b9cb86",
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}
```

さきほどのコマンドで起動したことを確認できます。

```
inayuky ~ % aws ec2-list                   
---------------------------------------------------------------------------------------
|                                  DescribeInstances                                  |
+----------------------+-------------------+-----------------+----------+-------------+
|          ID          |       Name        |    PublicIP     |  State   |    Type     |
+----------------------+-------------------+-----------------+----------+-------------+
|  i-0967ac2416c675bbc |  None             |  None           |  stopped |  t2.medium  |
|  i-0ec844c8f250dc055 |  sample2          |  18.182.142.129 |  stopped |  t3.micro   |
|  i-077ed543385b9cb86 |  sample1          |  13.114.103.130 |  running |  t3.micro   |
+----------------------+-------------------+-----------------+----------+-------------+
```

# インスタンス停止

起動と同様に`i-`より後の英数字を指定して停止できます。

```
inayuky ~ % aws ec2-stop 077ed543385b9cb86
{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-077ed543385b9cb86",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
```

# インスタンスの詳細表示

一覧表示以上の情報を知りたい場合に使います。
AWS CLIのままの表示形式なので見づらいですが、必要ならaliasファイルを修正して、ここで表示された情報の一部を`ec2-list`の方に追加表示するようにカスタマイズもできます。

```
inayuky ~ % aws ec2-show 077ed543385b9cb86
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0f9a314ce79311c88",
                    "InstanceId": "i-077ed543385b9cb86",
                    "InstanceType": "t3.micro",
                    "KeyName": "ec2_key",
                    "LaunchTime": "2022-05-15T12:21:30+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-10-0-0-123.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "10.0.0.123",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    },
・・・以下略・・・
```

# 参考情報

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-alias.html
AWS CLI エイリアスの作成と使用
公式マニュアルの記事です。

https://github.com/awslabs/awscli-aliases
AWS CLI エイリアスリポジトリ
サンプルがあるので独自コマンド追加の参考になりそうです。

https://dev.classmethod.jp/articles/aws-cli-alias/
AWS CLIにalias機能が追加されました
クラスメソッドさんの紹介記事です。