我是从Terraform开始的,我正在构建一个小项目,只是附有EBS卷的一些AWS实例。
我相信我会开始与Terraform一起工作,因此我想通过定义可以在其他项目中重复使用的模块来完成工作。
为此,我创建了3个模块(一个用于实例,另一个用于创建EBS卷,最后一个用于附加卷(。
在另一个地方,我有一个" main.tf",在其中称为这些模块。我遇到的问题是要创建和附加卷,我需要一些数据,例如InstanceID。
要获取InstanceID,我在"实例"模块上定义了一个输出变量(如果实例计数不止一个,则必须是列表(:
output "instance_id" {
value = ["${aws_instance.instance.*.id}"]
}
然后,在我的main.tf文件上,我在模块上调用变量:
module "aws-instance" {
source = "../../Terraform/aws-instance"
instance_type = "t2.micro"
instance_count = "2"
}
(some other code...)
module "aws-volume-attachment" {
source = "../../Terraform/aws-volume-attachment"
device_name = "/dev/sdf"
instance_id = "${element("${module.aws-instance.instance_id}", count.index)}"
volume_id = "${element("${module.aws-ebs-volume.volume_id}", count.index)}"
}
但是我有一个错误:
Error: module "aws-volume-attachment": count variables are only valid within resources
我的问题是,我如何循环遍历变量,以便我可以将每个卷连接到一个实例?
"计数"在声明Terraform模块时不支持。您有2个选项:
-
每个实例和每个EBS卷都声明模块。并将变量传递到没有" count.index"部分的模块中。
-
将EC2和ESB都放在同一模块中,因为没有彼此,它们就无法真正工作。这是构建Terraform项目的好习惯 - 为整个应用程序堆栈制作模块。因为当您有太多的小模块时 - 它会变得有些混乱。
计数仅在模块中,仅在资源中支持。在您的实例中,您需要将instance_count
的值传递给实例,音量和附件模块。然后,您将使用instance_count
用于模块中count
的值(在资源级别(。
如果使用count
,您的aws-instance module
将输出instance_ids
的"列表"。这些卷也是如此。
将这些列表传递到aws-volume-attachment
模块(instance_id
和volume_id
变量必须为类型list
(,然后使用count.index
迭代这些列表。
请原谅资源名称,我在使用Azure时对AWS提供商不熟悉,但希望这显示出校长。:
resource "aws-volume-attachment" {
count = "${var.instance_count}"
...
volume_id = "${var.volume_ids[count.index]}"
instance_id = "${var.instance_ids[count.index])"
}