如何创建多个卷并通过Terraform附加到每个实例

问题描述 投票:1回答:1

以下代码适用于ec2_instance_count = 1

但是,当ec2_instance_count = 2出现以下错误时。

Error: Error running plan: 1 error(s) occurred:

* module.build_ec2_app.aws_ebs_volume.ebs_volume: 1 error(s) occurred:

* module.build_ec2_app.aws_ebs_volume.ebs_volume: Resource 'aws_instance.ec2' not found for variable 'aws_instance.ec2.availability_zone'

我认为它与if语句var.ec2_create_volume == "true" ? 1 : 0有关

但即使我在两种资源上将"true" ? 1 : 0更改为"true" ? 2 : 0,我仍然会在ec2_instance_count = 2时出错

# Create EC2 instances
resource "aws_instance" "ec2" {
  count                   = "${var.ec2_instance_count}"
  ami                     = "${var.ec2_instance_ami_id}"
  instance_type           = "${var.ec2_instance_type}"
  subnet_id               = "${var.ec2_instance_subnet_id}"
  key_name                = "${var.ec2_instance_key_name}"
  vpc_security_group_ids  = ["${aws_security_group.create_security_group.id}"]

  tags {
    Name                  = "${var.ec2_app_name}0${count.index + 1}.${var.ec2_tl_domain_name}"
    service               = "${var.ec2_service}"
    environment           = "${var.ec2_environment}"
  }
}

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  availability_zone     = "${aws_instance.ec2.availability_zone}"
  size                  = "${var.ec2_ebs_volume_size}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  device_name           = "${var.ec2_device_name}"
  volume_id             = "${aws_ebs_volume.ebs_volume.id}"
  instance_id           = "${aws_instance.ec2.id}"
}
terraform
1个回答
1
投票

这里的问题是,当countaws_instance.ec2增加到2时,资源属性导出会从字符串更改为列表,并且您仍然将其作为字符串引用。你可以看到关于那个at the documentation here的更多信息。

通过更新volume_attachmentebs_volume资源以期望列表而不是字符串并相应地迭代aws_instance资源,您可以解决您的问题:

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  availability_zone     = "${aws_instance.ec2.*.availability_zone[count.index]}"
  size                  = "${var.ec2_ebs_volume_size}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 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]}"
}

请注意,即使count为1,这仍然可以正常工作。这里的建议是同步count资源的aws_instance和其他两个的count,以确保它们是相同的。

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_instance_count}"
  availability_zone     = "${aws_instance.ec2.*.availability_zone[count.index]}"
  size                  = "${var.ec2_ebs_volume_size}"
}

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

将输入变量锁定在一起可确保在更改实例计数时具有所需的行为,从而不会出现不期望的问题和副作用。

© www.soinside.com 2019 - 2024. All rights reserved.