如何使用 Terraform 创建不同大小的 EBS 卷并附加到单个 EC2 实例?

How to create the different size of EBS volume and attach to single EC2 instance using Terraform?

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

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 我正在为 root volume 定义配置,即 size 是 40GB,volume type 是gp2。现在我想创建 5 个以上资源 ebs_volume 中提到的另外 5 个卷并将它们附加到我下面定义的 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)}"

}

我的variable.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 实例?

首先,我认为您的 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,即访问 ebs_volume 的列表 count.index位置然后获取属性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
}

您需要将 EBS 的附件定义到 instance/instances。 之后,您需要安装它们。 我有一个小的 cheatsheet 供您使用的一个 EBS 实例。

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`
}