首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform -创建多个EBS卷

Terraform -创建多个EBS卷
EN

Stack Overflow用户
提问于 2019-05-20 16:54:19
回答 3查看 5.7K关注 0票数 0

如何创建多个EBS卷并将其附加到实例?

下面的代码在附加单个EBS卷时工作。我主要关心的是在EBS卷的大小和设备名称之间创建一个映射。我试过各种各样的东西,创建一个列表等等,但没有运气。

代码语言:javascript
复制
# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_create_volume == true ? var.ec2_instance_count : 0 }"
  availability_zone     = "${aws_instance.ec2.*.availability_zone[count.index]}"
  size                  = "${var.ec2_ebs_volume_size}"
  type                  = "${var.ec2_ebs_volume_type}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_create_volume == true ? var.ec2_instance_count : 0 }"
  device_name           = "${var.ec2_device_name}"
  volume_id             = "${aws_ebs_volume.ebs_volume.*.id[count.index]}"
  instance_id           = "${aws_instance.ec2.*.id[count.index]}"
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-24 10:50:20

就快到了,尝试使用element(list, index) -它会循环到列表上。例如,此配置将成功地创建2个ec2实例,每个实例附加3个额外的ebs卷:

代码语言:javascript
复制
variable "ec2_device_names" {
  default = [
    "/dev/sdd",
    "/dev/sde",
    "/dev/sdf",
  ]
}

variable "ec2_instance_count" {
  default = 2
}

variable "ec2_ebs_volume_count" {
  default = 3
}

resource "aws_instance" "ec2" {
  count         = "${var.ec2_instance_count}"
  ami           = "${var.aws_ami_id}"
  instance_type = "${var.ec2_instance_type}"
}

resource "aws_ebs_volume" "ebs_volume" {
  count             = "${var.ec2_instance_count * var.ec2_ebs_volume_count}"
  availability_zone = "${element(aws_instance.ec2.*.availability_zone, count.index)}"
  size              = "${var.ec2_ebs_volume_size}"
}

resource "aws_volume_attachment" "volume_attachement" {
  count       = "${var.ec2_instance_count * var.ec2_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.*.id, count.index)}"
}
票数 4
EN

Stack Overflow用户

发布于 2021-10-14 14:57:14

以防其他人在寻找答案。下面的解决方案适用于跨多个az的多个实例。在这里,additional_volume_size. device_name是字符串列表,因此我们需要传递与附加卷数量相同的名称,而volume_count是数字list的长度。

代码语言:javascript
复制
resource "aws_ebs_volume" "ebs_volume" {
      count             = var.instance_count * var.volume_count
      availability_zone = aws_instance.ec2[floor(count.index/var.volume_count)].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, floor(count.index/var.volume_count))
    }
票数 1
EN

Stack Overflow用户

发布于 2022-02-28 12:43:16

具有不同大小的多个EBS卷的多个EC2实例。这适用于奇数或偶数卷。

代码语言:javascript
复制
instance_count = 3
ebs_volume_count        = 2
ec2_ebs_volume_size     = [10, 15]
ec2_device_names        = ["/dev/sdd", "/dev/sde"]

variable "instance_count" {
  type        = number
  default     = 1
}

variable "ebs_volume_count" {
  type        = number
  default     = 0
}

variable "ec2_ebs_volume_size" {
  type        = list(any)
  default = [
    10
  ]
}

variable "ec2_device_names" {
  type = list(any)
  default = [
    "/dev/sdd"
  ]
}

variable "availability_zones" {
  type        = list(any)
}

variable "subnet_ids" {
  type        = list(any)
}

resource "aws_instance" "ec2_instance" {
  count         = var.instance_count 
  ami           = var.aws_ami_id
  availability_zone       = var.availability_zones[count.index]
  subnet_id               = var.subnet_ids[count.index]
  instance_type = var.ec2_instance_type
}

resource "aws_ebs_volume" "ebs_volume" {
  count             = var.instance_count * var.ebs_volume_count
  availability_zone = "${element(aws_instance.ec2_instance.*.availability_zone, floor (count.index/var.ebs_volume_count))}"
  size              = var.ec2_ebs_volume_size[count.index%var.ebs_volume_count]
}

resource "aws_volume_attachment" "volume_attachement" {
  count       = var.instance_count * var.ebs_volume_count
  volume_id   = aws_ebs_volume.ebs_volume.*.id[count.index]
  device_name = var.ec2_device_names[count.index%var.ebs_volume_count]
  instance_id = "${element(aws_instance.ec2_instance.*.id, floor (count.index/var.ebs_volume_count))}"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56225212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档