代码之家  ›  专栏  ›  技术社区  ›  Anonymouslemming

将输出变量与terraform一起使用时,“不是模块的有效输出”

  •  4
  • Anonymouslemming  · 技术社区  · 6 年前

    我正在尝试在AWS上使用Hashicorp Terraform为一个新项目设置一些IaC。我之所以使用模块,是因为我希望能够跨多个环境(staging、prod、dev等)重用东西

    我很难理解在一个模块中必须在何处设置输出变量,以及如何在另一个模块中使用该变量。任何指向此的指针都将不胜感激!

    创建EC2机器时,我需要使用在VPC模块(子网ID)中创建的一些东西。我的理解是,您不能在另一个模块中引用某个模块的内容,因此我尝试使用专有网络模块的输出变量。

    我的网站中有以下内容 main.tf

    module "myapp-vpc" {
      source     = "dev/vpc"
      aws_region = "${var.aws_region}"
    }
    
    module "myapp-ec2" {
     source     = "dev/ec2"
     aws_region = "${var.aws_region}"
     subnet_id  = "${module.vpc.subnetid"}
    }
    

    dev/vpc 只需设置一些值并使用我的专有网络模块:

    module "vpc" {
      source = "../../modules/vpc"
    
      aws_region = "${var.aws_region}"
    
      vpc-cidr            = "10.1.0.0/16"
      public-subnet-cidr  = "10.1.1.0/24"
      private-subnet-cidr = "10.1.2.0/24"
    }
    

    在我的vpc main中。tf,在最后,在 aws_vpc aws_subnet 资源(显示子网资源):

    resource "aws_subnet" "public" {
      vpc_id                  = "${aws_vpc.main.id}"
      map_public_ip_on_launch = true
      availability_zone       = "${var.aws_region}a"
      cidr_block              = "${var.public-subnet-cidr}"
    }
    
    output "subnetid" {
      value = "${aws_subnet.public.id}"
    }
    

    当我跑步时 terraform plan 我收到以下错误消息:

    错误:模块“vpc”:“subnetid”不是模块“vpc”的有效输出

    1 回复  |  直到 4 年前
        1
  •  15
  •   GabLeRoux Tidder Jail    5 年前

    每次输出都需要通过每个模块显式传递。

    例如,如果要从嵌套在另一个模块下面的模块向屏幕输出变量,则需要如下所示:

    子模块。tf公司

    output "child_foo" {
      value = "foobar"
    }
    

    父模块。tf公司

    module "child" {
      source = "path/to/child"
    }
    
    output "parent_foo" {
      value = "${module.child.child_foo}"
    }
    

    主要的tf公司

    module "parent" {
      source = "path/to/parent"
    }
    
    output "main_foo" {
      value = "${module.parent.parent_foo}"
    }