【问题标题】:How to create the different size of EBS volume and attach to single EC2 instance using Terraform?如何使用 Terraform 创建不同大小的 EBS 卷并附加到单个 EC2 实例?
【发布时间】:2021-07-29 17:25:16
【问题描述】:

我正在创建多个不同大小的卷,如下所示:

resource "aws_ebs_volume" "ebs_volume" {
  for_each = {
    0 = 100
    1 = 50
    2 = 20
    3 = 20
    4 = 50
  }
  availability_zone = var.availability_zone
  size              = each.value
  type              = "gp2"
}

我将像上面那样创建多个卷。现在,我想将它附加到单个 EC2 实例。 在下面,资源 ec2_production 我正在定义 根卷 的配置,即 大小为 40GB,卷类型为 gp2。现在我想再创建 5 个 5 个以上资源中提到的卷 ebs_volume 并将它们附加到我下面定义的 ec2_production 实例

resource "aws_instance" "ec2_production" {
  count         = "${var.ec2_instance_count}"
  ami           = "${var.ami}"
  availability_zone = var.availability_zone
  instance_type = "${var.ec2_instance_type}"
  subnet_id = aws_subnet.subnet.id
  associate_public_ip_address = true
  vpc_security_group_ids = [aws_security_group.security_group_access_internet.id]
  key_name = "key-pair"
  ebs_block_device {
    device_name = "/dev/sda1"
    volume_type = "gp2"
    volume_size = 40
  }
  tags = {
    Name = var.tag
  }
}

这是 EBS_volume_attachment 的资源:

我不确定如何传递设备名称以及如何将所有 EBS 卷附加到我的 AWS 实例:

resource "aws_volume_attachment" "volume_attachement" {
  count       = "${var.ec2_instance_count * var.ebs_volume_count}"
  volume_id   = "${aws_ebs_volume.ebs_volume.*.id[count.index]}"
  device_name = "${element(var.ec2_device_names, count.index)}"
  instance_id = "${element(aws_instance.ec2_production.*.id, count.index)}"

}

我的变量.tf 文件

variable "ec2_device_names" {
    default = [
    "/dev/sdf",
    "/dev/sdg",
    "/dev/sdh",
    "/dev/sdi",
    "/dev/sdj"
  ]
}

variable "ec2_instance_count" {
  default = 1
}

variable "ec2_instance_type" {
  default = "t2.micro"
}

variable "ami" {
    default = "ami-0d382e80be7ffdae5"
}

有什么方法可以将所有卷附加到我在上面创建的每个设备并附加到我的 EC2 实例?

【问题讨论】:

  • 你目前的方法有什么问题?
  • @Marcin 抱歉评论格式不正确
  • 您应该编辑您的问题以包含格式正确的错误,而不是将其留在 cmets 中。
  • 请始终在问题本身中包含相关的错误消息。

标签: amazon-web-services amazon-ec2 terraform terraform-provider-aws amazon-ebs


【解决方案1】:
resource "aws_ebs_volume" "ebs_volume" {
  count             = var.instance_count * var.volume_count
  availability_zone = aws_instance.ec2[count.index < var.volume_count ? 0 : 1 ].availability_zone
  size              = var.additional_volume_size[count.index%var.volume_count]
}

resource "aws_volume_attachment" "volume_attachement" {
  count       = var.instance_count * var.volume_count
  volume_id   = element(aws_ebs_volume.ebs_volume.*.id, count.index)
  device_name = element(var.device_name, count.index)
  instance_id = element(aws_instance.ec2.*.id, count.index < var.volume_count ? 0 : 1)
  force_detach = true`enter code here`
}

【讨论】:

    【解决方案2】:

    首先我认为您的aws_ebs_volume 在问题中被错误命名,但这可能只是一个复制和粘贴错误,它应该是resource "aws_ebs_volume" "ebs_volume" 而不是resource "aws_ebs_volume" "for_each"

    在您的aws_volume_attachment 中,您第二次访问ebs_volume 索引不正确,您想做volume_id = aws_ebs_volume.ebs_volume[count.index].id,即访问count.index 位置处的ebs_volume 列表,然后获取属性id .

    第三,aws_volume_attachment 中的 count 迭代次数过多,instance_id 可以修复。

    因此,aws_volume_attachment 的更新代码应如下所示:

    resource "aws_volume_attachment" "volume_attachement" {
      count       = var.ebs_volume_count
      volume_id   = aws_ebs_volume.ebs_volume[count.index].id
      device_name = "${element(var.ec2_device_names, count.index)}"
      instance_id = aws_instance.ec2_production.id
    }
    

    【讨论】:

    • 感谢您的建议。现在我更清楚地更新了我的问题。
    • 更新了答案@RavikantGautam
    【解决方案3】:

    您需要定义 EBS 到实例/实例的附件。 之后,您需要安装它们。 我有一个小的 cheatsheet 用于您可能使用的一个 Instance-EBS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 2023-03-25
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多