以下代码适用于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}"
}
这里的问题是,当count
的aws_instance.ec2
增加到2时,资源属性导出会从字符串更改为列表,并且您仍然将其作为字符串引用。你可以看到关于那个at the documentation here的更多信息。
通过更新volume_attachment
和ebs_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]}"
}
将输入变量锁定在一起可确保在更改实例计数时具有所需的行为,从而不会出现不期望的问题和副作用。