AWS EC2 インスタンスの起動、開始、停止、休止、終了の違い

<abbr title="Amazon Web Services">AWS</abbr> の Amazon <abbr title="Elastic Compute Cloud">EC2</abbr> における**インスタンスの操作**の表記が「**起動、開始、再起動、停止、休止、終了**」、また**インスタンスの状態**の表記が「**実行中、保留中、シャットダウン中、停止中、停止済み、終了済み**」と日本語では大変分かりづらくなっているので、その違いについて整理する。

### インスタンスの操作
Amazon EC2 のインスタンスの操作は、以下の7つの表記が存在する。

|日本語表記|英語表記|
|---|---|
|インスタンスを起動|Launch instaces|
|テンプレートからインスタンスを起動|Launch instance from template|
|インスタンスを開始|Start instance|
|インスタンスを再起動|Reboot instance|
|インスタンスを停止|Stop instance|
|インスタンスを休止|Hibernate instance|
|インスタンスを終了|Terminate instance|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/4701e088-7112-0579-834c-bbea273f162e.png" width="300"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/62856b61-5d26-deb2-ba5a-c9b5fa9bd06b.png" width="240">
#### 違いの要約
##### 「起動」と「開始」
|表記|内容|
|---|---|
|起動 (Launch)|新規のインスタンスの作成とその起動。|
|開始 (Start)|既存の「停止済み」のインスタンスの起動。|

##### 「停止」と「休止」と「終了」
|表記|内容|
|---|---|
|停止 (Stop)|インスタンスのシャットダウン。|
|休止 (Hibernate)|インスタンスのサスペンド。メモリも保存される。|
|終了 (Terminate)|インスタンスの削除。起動や接続は不可能。|

##### 「再起動」と「停止/開始」と「休止/開始」
|表記|内容|
|---|---|
|再起動 (Reboot)||
|停止/開始 (Stop/Start)||
|休止/開始 (Hibernate/Start)||

#### 起動 (Launch)
##### インスタンス起動ウィザード
##### 起動テンプレート
##### 既存インスタンス
##### AWS Marketplace インスタンス
#### 開始 (Start)
#### 再起動 (Reboot)
#### 停止 (Stop)
#### 休止 (Hibernate)
#### 終了 (Terminate)

### インスタンスのライフサイクル

[インスタンスのライフサイクル - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html#lifecycle-differences)

![インスタンスのライフサイクル](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/instance_lifecycle.png)

#### インスタンスの状態
|日本語表記|英語表記|値|課金|説明|
|---|---|---|:-:|---|
|実行中|Running|running|◯|インスタンスが起動済み|
|保留中|Pending|pending|×|インスタンスの起動中|
|シャットダウン中|Shutting Down|shutting-down|×|インスタンスの削除(Terminate)中|
|停止中|Stopping|stopping|△|インスタンスのシャットダウン(Stop)またはサスペンド(Hibernate)中|
|停止済み|Stopped|stopped|×|インスタンスがシャットダウン(Stop)済み|
|終了済み|Terminated|terminated|×|インスタンスが削除済み|

:::note warn
大変紛らわしいが、ここでの日本語表記の **[シャットダウン中]** および **[終了済み]** はいずれも「インスタンスの削除」を意味する。
:::
:::note info
インスタンスの状態が「停止中(Stopping)」の場合、停止(Stop)準備中なら課金されないが、休止(Hibernate)準備中だと課金対象となる。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/40f2acc1-dbe5-23dd-d664-b757c553cabf.png" width="300">


### 終了保護の設定
停止 (Stop) と終了 (Terminate) を取り違えて Amazon EC2 インスタンスを誤って削除(終了)しないようにするために、インスタンスの「終了保護」を有効にできる。
`DisableApiTermination` 属性は、インスタンスがコンソール、CLI、または API を使用して終了できるかどうかを制御し、デフォルトでは無効 (`false`) になっている。 [^disableApiTermination]

#### AWS マネジメントコンソールで変更する
[AWS マネジメントコンソール](https://aws.amazon.com/jp/console/)でインスタンスの終了保護を有効にするには、一覧からインスタンスを選択してから、**[アクション]** または右クリック > **[インスタンスの設定]** > **[終了保護を変更]** の順に選択する。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/13652752-1e4a-e60f-3df7-9e4c374aac3a.png)

「終了保護を変更」画面に切り替わったら **[有効化]** にチェックをいれて **[保存]** ボタンを押下する。
![「終了保護を変更」画面のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/96b3bfa4-7797-5917-314b-451c986cf600.png)

[^disableApiTermination]: <q cite="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/terminating-instances.html#Using_ChangingDisableAPITermination">デフォルトでは、Amazon EC2 コンソール、コマンドラインインターフェイス、または API を使用して、インスタンスを終了できます。Amazon EC2 を使用してインスタンスを誤って終了できないようにするには、*インスタンスの削除保護*を有効にできます。`DisableApiTermination` 属性は、インスタンスがコンソール、CLI、または API を使用して終了できるかどうかを制御します。デフォルトでは、インスタンスの削除保護は無効になっています。インスタンスが実行中またはインスタンスが停止中に、インスタンスを起動する際に、この属性の値を設定できます (Amazon EBS-backed インスタンスの場合)。</q> - **削除保護の有効化** - <cite>[インスタンスの終了 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/terminating-instances.html) - <i>docs.aws.amazon.com</i></cite>

#### AWS CLI で変更する
[AWS コマンドラインインターフェイス (CLI)](https://aws.amazon.com/jp/cli/) でインスタンスの終了保護を有効にするには `modify-instance-attribute` コマンド ([[v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-attribute.html)][[v1](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)]) を使用する。

##### 起動中のインスタンスの一覧
```bash
aws ec2 describe-instances \
 --filters Name=instance-state-name,Values=running \
 --output table \
 --query 'Reservations[*].Instances[].{
  AvailabilityZone: Placement.AvailabilityZone,
  ID: InstanceId,
  Name: Tags[?Key==`Name`] | [0].Value,
  State: State.Name,
  Type: InstanceType
  }'
```
<details><summary>結果</summary><div>

```
------------------------------------------------------------------------------------------
|                                    DescribeInstances                                   |
+------------------+-----------------------+--------------------+----------+-------------+
| AvailabilityZone |          ID           |       Name         |  State   |    Type     |
+------------------+-----------------------+--------------------+----------+-------------+
|  ap-northeast-1a |  i-xxxxxxxxxxxxxxxxx  |  project-dev-app   |  running |  t2.micro   |
+------------------+-----------------------+--------------------+----------+-------------+
```
</div></details>

##### インスタンスの終了保護設定値の確認
```bash
aws ec2 describe-instance-attribute \
 --instance-id i-xxxxxxxxxxxxxxxxx \
 --attribute disableApiTermination
```
<details><summary>結果</summary><div>

```json
{
    "InstanceId": "i-xxxxxxxxxxxxxxxxx",
    "DisableApiTermination": {
        "Value": false
    }
}
```
</div></details>

##### インスタンスの終了保護設定値の変更
```bash
aws ec2 modify-instance-attribute \
 --instance-id=i-xxxxxxxxxxxxxxxxx \
 --disable-api-termination
```

##### 設定値の変更の確認
```bash
aws ec2 describe-instance-attribute \
 --instance-id i-xxxxxxxxxxxxxxxxx \
 --attribute disableApiTermination
```
<details><summary>結果</summary><div>

```json
{
    "InstanceId": "i-xxxxxxxxxxxxxxxxx",
    "DisableApiTermination": {
        "Value": true
    }
}
```
</div></details>

:::note warn
`disableApiTermination` 属性は1文字目が小文字でないと認識しないので注意。
:::