10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformによるEBS追加ボリュームの拡張

Posted at

こんにちは。株式会社オージス総研の大江です。
この記事は「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

EBSボリューム

ec2.tf
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に変更
ec2.tf
  # 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に拡張されていることが確認できました。
スクリーンショット 2025-07-21 22.10.34.png

②EBS追加ボリュームのサイズ変更

次にterraformからEBS拡張ボリュームを変更しました。

EC2.tfのEBS追加ボリュームを30GB→35GBに変更
ec2.tf
  # 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コンソール上から確認しても変更が実行されていないことが確認できました。
スクリーンショット 2025-07-21 22.10.34.png

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ボリュームのデタッチ

スクリーンショット 2025-07-21 23.21.07.png

Terraformコードの修正
ec2.tf
# 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インスタンスにアタッチされていることが確認できました。
スクリーンショット 2025-07-21 23.24.39.png

②’EBS追加ボリュームのサイズ変更(Terraformコード修正後)

再度TerraformからEBS拡張ボリュームを変更しました。

EC2.tfのEBS追加ボリュームを30GB→35GBに変更
ec2.tf
# 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に拡張されていることが確認できました。
スクリーンショット 2025-07-21 23.40.32.png

おわりに

今回はTerraformによるEBSボリュームのサイズ変更の検証を行いました。Terraformはコードを一度作成すると、リソース構築・削除が容易に可能な素晴らしいツールであることを改めて実感しました。一方で、記述によっては想定と異なる動作となってしまうこともあります。今回はEC2、EBSの範囲のみを対象としてみましたが、今後はさらに広い範囲でIaCを活用していきたいと思います。
ここまで読んでくださりありがとうございました。

参考

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?