Amazon ec2 Terraform:使用模块循环输出变量

Amazon ec2 Terraform:使用模块循环输出变量,amazon-ec2,terraform,terraform-provider-aws,Amazon Ec2,Terraform,Terraform Provider Aws,我从terraform开始,我正在构建一个小项目,只是一些aws实例,其中一个附带了ebs卷 我相信我会开始更多地使用terraform,所以我想通过定义模块来完成这项工作,然后在其他项目中重用这些模块 为此,我创建了3个模块(一个用于实例,另一个用于创建ebs卷,最后一个用于连接卷) 在另一个地方,我有一个“main.tf”,我在其中调用这些模块。我遇到的问题是,要创建和连接卷,我需要一些数据,如instanceID 为了获取InstanceID,我在“instance”模块上定义了一个输出变

我从terraform开始,我正在构建一个小项目,只是一些aws实例,其中一个附带了ebs卷

我相信我会开始更多地使用terraform,所以我想通过定义模块来完成这项工作,然后在其他项目中重用这些模块

为此,我创建了3个模块(一个用于实例,另一个用于创建ebs卷,最后一个用于连接卷)

在另一个地方,我有一个“main.tf”,我在其中调用这些模块。我遇到的问题是,要创建和连接卷,我需要一些数据,如instanceID

为了获取InstanceID,我在“instance”模块上定义了一个输出变量(如果实例计数不止一个,则必须是一个列表):

然后,在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模块时使用“计数”。 您有两种选择:

  • 为每个实例和每个ebs卷声明模块。并将变量传递到模块中,而不包含“count.index”部分

  • 将EC2和ESB放在同一个模块中,因为它们没有彼此就无法真正工作。这是构建terraform项目的一个良好实践——为整个应用程序堆栈制作模块。因为当你有太多的小模块时,它会变得有点混乱

  • “计数”是指在声明Terraform模块时。 您有两种选择:

  • 为每个实例和每个ebs卷声明模块。并将变量传递到模块中,而不包含“count.index”部分

  • 将EC2和ESB放在同一个模块中,因为它们没有彼此就无法真正工作。这是构建terraform项目的一个良好实践——为整个应用程序堆栈制作模块。因为当你有太多的小模块时,它会变得有点混乱


  • 在模块中不支持计数,仅在资源中支持计数。在您的实例中,您希望将
    instance\u count
    的值传递给实例、卷和附件模块。然后,您将使用
    instance\u count
    作为模块内的
    count
    值(在资源级别)

    如果正在使用
    count
    ,您的
    aws实例模块将输出一个
    实例ID的“列表”
    。卷也是如此

    将这些列表传递到aws卷附件
    模块(
    实例id
    卷id
    变量的类型必须为
    列表
    ),然后使用
    计数.索引
    对其进行迭代

    请原谅资源名称,我不熟悉AWS提供商,因为我使用Azure,但希望这能说明主要问题:

    resource "aws-volume-attachment" {
      count = "${var.instance_count}"
      ...
    
      volume_id = "${var.volume_ids[count.index]}"
      instance_id = "${var.instance_ids[count.index])"
    }
    

    在模块中不支持计数,仅在资源中支持计数。在您的实例中,您希望将
    instance\u count
    的值传递给实例、卷和附件模块。然后,您将使用
    instance\u count
    作为模块内的
    count
    值(在资源级别)

    如果正在使用
    count
    ,您的
    aws实例模块将输出一个
    实例ID的“列表”
    。卷也是如此

    将这些列表传递到aws卷附件
    模块(
    实例id
    卷id
    变量的类型必须为
    列表
    ),然后使用
    计数.索引
    对其进行迭代

    请原谅资源名称,我不熟悉AWS提供商,因为我使用Azure,但希望这能说明主要问题:

    resource "aws-volume-attachment" {
      count = "${var.instance_count}"
      ...
    
      volume_id = "${var.volume_ids[count.index]}"
      instance_id = "${var.instance_ids[count.index])"
    }