将多个ebs卷附加到每个ec2实例



我正在尝试将多个ebs卷附加到每个实例。在这个特定的场景中,我试图将两个ebs卷(/dev/sde、/dev/sdf)分别附加到我正在创建的两个ec2实例上。ebs卷的数量和ec2实例的数量是变量(这意味着它们可以改变)。3个ebs卷到每个ec2,总共3个ec2s,所以它们不是恒定的)。

但一些原因,我得到这个错误

Error: Error attaching volume (vol-0f1ace71d7af68b36) to instance
(i-029671a0d4d152761), message: "Invalid value '/dev/sde' for unixDevice. Attachment 
point/dev/sde is already in use", code: "InvalidParameterValue"

这是附件工作的块

resource "aws_instance" "data_node" {
count= var.ec2_count
instance_type = var.instance_type
availability_zone = "us-east-1b"
ami = "ami-0747bdcabd34c712a"
key_name = "test-ec2"
tags = {
Name = "ec2-attr"
}
}
resource "aws_ebs_volume" "test_volume" {
count       = var.ec2_count * var.test_ebs_volume_count
size= 16000
type = "gp2"
availability_zone = "us-east-1b"
tags = {
Name = "1e-volume-${count.index + 1}"
}
}

resource "aws_volume_attachment" "volume_attachement" {
count       = var.ec2_count * var.test_ebs_volume_count
volume_id   = aws_ebs_volume.test_volume.*.id[count.index]
device_name = element(var.ec2_device_names, (count.index))
instance_id = element(aws_instance.data_node.*.id, ((count.index+1)%2))
}

variable "ec2_device_names" {
description = "multiple devices for each ec2 instance"
default = [
"/dev/sde",
"/dev/sdf"
]
}

variable "ec2_count" {
default = 2
}
variable "test_ebs_volume_count" {
default = 2
}
variable "test_ebs_volume_size" {
default = 16000
}

我能够看到正在创建的所有4个ebs卷和正在创建的2个ec2实例。但是一个ec2实例连接了/dev/sde,另一个ec2实例连接到/dev/sdf

我想看到/dev/sde和/dev/sdf都附加到第一个ec2实例和第二个ec2实例上。

first ec2:
/dev/sde    
/dev/sdf     
second ec2:
/dev/sde
/dev/sdf

我知道我在"aws_volume_attachment"中缺少了一些东西。块代码。如有任何建议,不胜感激。

我可以让它工作,如果我改变这个

variable "ec2_device_names" {
description = "multiple devices for each ec2 instance"
default = [
"/dev/sde",
"/dev/sdf"
]
}

variable "ec2_device_names" {
description = "multiple devices for each ec2 instance"
default = [
"/dev/sde",
"/dev/sde",
"/dev/sdf",
"/dev/sdf"
]
}

因为我只使用2个ec2实例,所以上述解决方案有效,但如果我必须有3个ec2实例,则变为

variable "ec2_device_names" {
description = "multiple devices for each ec2 instance"
default = [
"/dev/sde",
"/dev/sde",
"/dev/sde",
"/dev/sdf",
"/dev/sdf",
"/dev/sdf"
]
}

看,这不是一个很好的解决方案。

我会重新组织你的代码,大多使用for_each,而不是count。下面是工作示例你能做什么:


variable "ec2_count" {
default = 2
}
variable "test_ebs_volume_count" {
default = 2
}
variable "test_ebs_volume_size" {
default = 8
}

variable "ec2_device_names" {
description = "multiple devices for each ec2 instance"
default = [
"/dev/sde",
"/dev/sdf"
]
}

resource "aws_instance" "data_node" {
count= var.ec2_count
instance_type = "t2.micro"
availability_zone = "us-east-1b"
ami = "ami-0747bdcabd34c712a"
#key_name = "test-ec2"
tags = {
Name = "ec2-attr"
}
}
locals {
# local map to keep track of relationships between
# ec2 instances and volume devices
instance_device_map = merge([
for idx1, instance in aws_instance.data_node:
{ for idx2, ec2_device_name in var.ec2_device_names:
"${instance.id}-${ec2_device_name}" => {
instance_id     = instance.id
ec2_device_name = ec2_device_name
index = idx1*length(var.ec2_device_names) + idx2
}
}  
]...)
}
resource "aws_ebs_volume" "test_volume" {
for_each       = local.instance_device_map
size= 8
type = "gp2"
availability_zone = "us-east-1b"
tags = {
Name = "1e-volume-${each.value.index}"
}
}

resource "aws_volume_attachment" "volume_attachement" {
for_each    = local.instance_device_map
volume_id   = aws_ebs_volume.test_volume[each.key].id
device_name = each.value.ec2_device_name
instance_id = each.value.instance_id
}

output "tgest" {
value = local.instance_device_map
}

最新更新