こんにちは。株式会社オージス総研の大江です。
この記事は「2025 Japan AWS Jr. Chanpions 夏のQiitaリレー 」の18日目の記事です。
過去の投稿(リンク集)はこちらからご覧ください!
はじめに
EBSについて、2017年のアップデートよりEC2インスタンスの停止を実施せずにEBSボリュームサイズの拡張ができることはご存知の方も多いと思います。
しかしながら、AWSコンソール上から変更するのと同様に、ボリュームが複数ある場合もTerraformを使用して停止不要でボリューム拡張が可能かについては知識がなかったため、今回検証を行いました。
TerraformによるEBSボリュームの拡張
検証環境
- 機種/OS:MacBook Air(M2) Sequoia v15.5
- Terraform:Terraform v1.12.2 on darwin_amd64
- provider:aws v6.0.0
EBSボリューム拡張の検証
- 使用したEC2インスタンスおよびEBSボリュームは以下の構成としました。
- EC2インスタンス(Windows Server 2025)
- EBSルートボリューム - 30GB
- EBS追加ボリューム - 30GB
- EC2インスタンス(Windows Server 2025)
resource "aws_instance" "ec2_windows" {
ami = "ami-0414570e96b462020" # Windows Server 2025
instance_type = "t3.micro"
iam_instance_profile = aws_iam_instance_profile.iam_instance_profile.id
subnet_id = aws_subnet.public_subnet_1a.id
key_name = aws_key_pair.this.id
tags = {
Name = "${var.prefix}-ec2"
}
# EBSルートボリューム
root_block_device {
volume_size = 30
volume_type = "gp3"
delete_on_termination = true
encrypted = "true"
tags = {
Name = "${var.prefix}-root-vol"
}
}
# EBS追加ボリューム
ebs_block_device {
device_name = "/dev/sdf"
volume_size = 30
volume_type = "gp3"
delete_on_termination = true
encrypted = "true"
tags = {
Name = "${var.prefix}-advance-vol"
}
}
}
①EBSルートボリュームのサイズ変更
まずはterraformからEBSルートボリュームを変更しました。
EC2.tfのEBSルートボリュームを30GB→35GBに変更
# EBSルートボリューム
root_block_device {
volume_size = 35 # 30GB -> 35GB
Terraform実行結果
~ root_block_device {
tags = {
"Name" = "terraform-root-vol"
}
~ volume_size = 30 -> 35
# (9 unchanged attributes hidden)
}
:
:
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
AWSコンソール上からボリュームサイズを確認するとEBSのルートボリュームが35GBに拡張されていることが確認できました。
②EBS追加ボリュームのサイズ変更
次にterraformからEBS拡張ボリュームを変更しました。
EC2.tfのEBS追加ボリュームを30GB→35GBに変更
# EBSルートボリューム
ebs_block_device {
device_name = "/dev/sdf"
volume_size = 35 # 30GB -> 35GB
Terraform実行結果
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
追加ボリュームではTerraformコードの変更が検出されず、AWSコンソール上から確認しても変更が実行されていないことが確認できました。
TerraformによるEBS追加ボリュームの変更が反映されない理由
原因についてTerraform Registryを確認したところ、2025年7月時点において、「ebs_block_device」の設定変更は検知されない仕様となっており、代わりに「aws_ebs_volume」と「aws_volume_attachment」を使用する必要があるとのことです。
こちらはクラスメソッドさんでも同じ内容の記事が投稿されておりました。
追加ボリュームのTerraformコード修正
「aws_ebs_volume」と「aws_volume_attachment」を使用した形式にTerraformコード修正
既存の追加ボリュームをAWSコンソール上からデタッチ後、「ebs_block_device」を「aws_ebs_volume」と「aws_volume_attachment」に書き換え、改めてterraformで追加ボリュームを作成しました。
既存EBSボリュームのデタッチ
Terraformコードの修正
# EBS追加ボリューム
resource "aws_ebs_volume" "sdf" {
availability_zone = "${var.region}a"
size = 30
type = "gp3"
encrypted = "true"
tags = {
Name = "${var.prefix}-advance-vol"
}
}
# EBS追加ボリュームのアタッチ
resource "aws_volume_attachment" "sdf" {
device_name = "/dev/sdf"
volume_id = aws_ebs_volume.sdf.id
instance_id = aws_instance.ec2_windows.id
}
Terraform実行結果
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
Terraform will perform the following actions:
# aws_volume_attachment.sdf will be created
+ resource "aws_volume_attachment" "sdf" {
+ device_name = "/dev/sdf"
+ id = (known after apply)
+ instance_id = "i-03823694d4440cbe2"
+ region = "ap-northeast-1"
+ volume_id = "vol-0ae313ce72fd8d0b7"
}
:
:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
新規に作成したEBS追加ボリュームがEC2インスタンスにアタッチされていることが確認できました。
②’EBS追加ボリュームのサイズ変更(Terraformコード修正後)
再度TerraformからEBS拡張ボリュームを変更しました。
EC2.tfのEBS追加ボリュームを30GB→35GBに変更
# EBS追加ボリューム
resource "aws_ebs_volume" "sdf" {
availability_zone = "${var.region}a"
size = 35 # 30GB -> 35GB
Terraform実行結果
~ resource "aws_ebs_volume" "sdf" {
id = "vol-0ae313ce72fd8d0b7"
~ size = 30 -> 35
:
:
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
AWSコンソール上からボリュームサイズを確認するとEBSの追加ボリュームが35GBに拡張されていることが確認できました。
おわりに
今回はTerraformによるEBSボリュームのサイズ変更の検証を行いました。Terraformはコードを一度作成すると、リソース構築・削除が容易に可能な素晴らしいツールであることを改めて実感しました。一方で、記述によっては想定と異なる動作となってしまうこともあります。今回はEC2、EBSの範囲のみを対象としてみましたが、今後はさらに広い範囲でIaCを活用していきたいと思います。
ここまで読んでくださりありがとうございました。