TerraformからEC2のインスタンスタイプを変更したときの挙動

## はじめに
こんにちは、そしてこんばんは！Rockyです。
今回は、Terraformのコードを編集し、EC2のインスタンスタイプを変更した際の挙動について書いていきます。

## 背景
業務の中で、インスタンスタイプを変更する依頼が飛んできたときに、マネジメントコンソールからやればいいのでは？と思ったものの、せっかくTerraformのコードがあるので、やってみよう！と思いましたが、
新しくインスタンスが作成されてしまう懸念があったため、検証しました。

## まずはTerraformを編集
こちらはサンプルになりますが、コメントで示した部分を編集します。
（セキュリティグループのIDなどはテストのためハードコードしちゃってます）
```hcl
resource "aws_instance" "test" {
    ami                    = "ami-0ef29ab52ff72213b"
    instance_type          = "t2.micro" ## ここを t3.micro へ
    availability_zone      = "ap-northeast-1d"
    vpc_security_group_ids = ["sg-XXXX"]
    subnet_id              = "subnet-XXXX"

    root_block_device {
      volume_type = "gp3"
      volume_size = "8"
      iops        = 3000
      throughput  = 125
      encrypted   = false
    }

    tags = {
      Name   = "test-otake"
    }
}
```

## 実際にapplyしてみる
以下がapplyの結果です。
無事にCompleteとなってます！
```
❯ terraform apply
aws_instance.test: Refreshing state... [id=i-XXXX]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place
Terraform will perform the following actions:
  # aws_instance.test will be updated in-place
  ~ resource "aws_instance" "test" {
        id                                   = "i-XXXX"
      ~ instance_type                        = "t2.micro" -> "t3.micro"
        tags                                 = {
            "Name"  = "test-otake"
            "Owner" = "otake"
        }
      + user_data_replace_on_change          = false
        # (37 unchanged attributes hidden)
        # (8 unchanged blocks hidden)
    }
Plan: 0 to add, 1 to change, 0 to destroy.
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.
  Enter a value: yes
aws_instance.test: Modifying... [id=i-XXXX]
aws_instance.test: Still modifying... [id=i-XXXX, 10s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 20s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 30s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 40s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 50s elapsed]
aws_instance.test: Modifications complete after 53s [id=i-XXXX]
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.


```

### apply後のインスタンス
apply後は以下のように「停止中」となり、再起動に入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396559/d10f7e58-50a5-f93a-aa20-c9c782ea961b.png)

無事に停止

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396559/20863ba3-038f-4bb6-8e85-85bb19939eec.png)


### 再起動後
停止後、無事にインスタンスタイプが変更された状態で起動してきました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396559/a2913c75-38f0-15b6-cbb6-681fcab556a1.png)


### apply結果に注目
ふと、どれくらいの時間で変更できたのか気になったので、apply結果をよく見てみると
下記のように Modifying... から complete まで 60秒行かないぐらいで完了していました。
テストのため、そこまでインスタンスタイプ自体も大きくなかったのでこのぐらいかと思われますが、
環境によってはもう少し時間がかかる場合もあるかもしれませんね。。
```
aws_instance.test: Modifying... [id=i-XXXX]
aws_instance.test: Still modifying... [id=i-XXXX, 10s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 20s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 30s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 40s elapsed]
aws_instance.test: Still modifying... [id=i-XXXX, 50s elapsed]
aws_instance.test: Modifications complete after 53s [id=i-XXXX]
```

### まとめ
- Terraformからインスタンスタイプを変更しても、新しくインスタンスは作成されない
- マネジメントコンソールから操作するときと同様の再起動の動きをする
- せっかくコードがあるならTerraformからやったほうが良い！

今回は、懸念点があったため検証してみましたが、やはりポチポチ操作するよりもTerraformからやったほうが楽でスピーディーに作業を実施できます！
また、記述自体もそこまで難しいものではないので、書いたことがない方もぜひ試してみてください！
短いですが、この記事がどなたかの役に立ちますと幸いです！