Amazon web services 使用模块时无法读取terraform.tfstate

Amazon web services 使用模块时无法读取terraform.tfstate,amazon-web-services,module,terraform,terraform-provider-aws,Amazon Web Services,Module,Terraform,Terraform Provider Aws,我正在使用Terraform v0.12.6。我正在使用模块创建VPC、子网和EC2实例 root.tf vpc.tf pub_subnet.tf web_server.tf vpc.tf和pub_subnet.tf工作正常,并显示所需的输出。但是,我无法使用模块pub_subnet.tf中的subnet_id作为web_server.tf的输入 原因是它是一个列表,我得到的属性“subnet_id”的值不合适:string required 看起来我必须读取terraf

我正在使用Terraform v0.12.6。我正在使用模块创建VPC、子网和EC2实例

root.tf 
   vpc.tf
   pub_subnet.tf
   web_server.tf 
vpc.tf和pub_subnet.tf工作正常,并显示所需的输出。但是,我无法使用模块pub_subnet.tf中的subnet_id作为web_server.tf的输入

原因是它是一个列表,我得到的属性“subnet_id”的值不合适:string required

看起来我必须读取terraform.tfstate文件

这是我现在的密码-

root.tf

    provider "aws" {
      region = "us-east-1"
    }
    data "terraform_remote_state" "public_subnet" {
    backend = "local"
    config = {
      path = "terraform.tfstate"
    }
    }
    module "my_vpc" {
      source = "../modules/vpc_flowlogs"
      vpc_cidr = "10.0.0.0/16"
     # vpc_id  = "${module.my_vpc.vpc_id}"
       }

    module "vpc_igw" {
      source = "../modules/vpc_igw"  
      vpc_id  = "${module.my_vpc.vpc_id}"

    }
    module "public_subnets" {
      source="../modules/pub_subnets"
      vpc_id  = "${module.my_vpc.vpc_id}"
    }

     module "web_servers" {
    source = "../modules/webservers"
    vpc_id  = "${module.my_vpc.vpc_id}"
    subnet_id = 
    "${data.terraform_remote_state.public_subnet.outputs.subnet_id[0]}"
    } 
web_servers.tf

resource "aws_instance" "web-srvs" {
count="${var.instance_count == "0" ? "1" : var.instance_count}"
ami = "ami-035b3c7efe6d061d5"
instance_type = "t2.nano"
key_name="xxx-dev"
subnet_id = "${var.subnet_id}"
vpc_security_group_ids = ["${aws_security_group.pub_sg.id}"]
associate_public_ip_address=true
}
我正在尝试使用创建的两个子网ID。 我尝试过不同的方法,但现在已经没有主意了。 仅供参考,我的tfstate文件与root.tf位于同一目录中


谢谢你的帮助。或者这是一个bug?

您无缘无故地请求远程状态。远程状态用于引用来自其他配置的输出。您有模块,所以您应该将其更改为引用模块资源,但您必须输出模块中的值,以便在其他地方引用它

subnet_id = 
    "${data.terraform_remote_state.public_subnet.outputs.subnet_id[0]}"
    } 

Should be

subnet_id = 
    "${module.public_subnets.subnet.id}"
    }
在子网模块中,创建输出资源

output "subnet" {
  value = "${aws_subnet.some_subnet.id}"
}

您无缘无故地请求远程状态。远程状态用于引用来自其他配置的输出。您有模块,所以您应该将其更改为引用模块资源,但您必须输出模块中的值,以便在其他地方引用它

subnet_id = 
    "${data.terraform_remote_state.public_subnet.outputs.subnet_id[0]}"
    } 

Should be

subnet_id = 
    "${module.public_subnets.subnet.id}"
    }
在子网模块中,创建输出资源

output "subnet" {
  value = "${aws_subnet.some_subnet.id}"
}

我对subnet\u id=“${module.public\u subnets.subnet.id}”进行了以下更改,并创建了一个输出--output“subnet\u id”{value=“${aws\u subnet.public\u subnets.id}}我得到了以下错误--error:在输出“subnet\u id”中的../modules/pub\u subnets/output.tf第2行缺少资源实例键:value=”${aws_subnet.public_subnet.id}“由于aws_subnet.public_subnet设置了“count”,因此必须在特定实例上访问其属性。例如,要与引用资源的索引关联,请使用:aws_subnet.public_subnet[count.index]您可以发布子网模块代码吗?根据错误消息,您正在创建多个子网,这将创建一个额外的质询。EC2实例只能在一个子网中启动。因此,需要一些额外的逻辑来确定要启动实例的子网。输出值可以更改为“${aws_subnet.some_subnet.*.id}以输出使用count方法创建的所有子网。但是,如果您想在每个子网中创建实例,则需要选择一个来启动实例。
resource aws_subnet“public_subnet”{count=2 vpc_id=“${var.vpc_id}”cidr_block=“${var.sub cdr[count.index]}”availability_zone=”${data.aws\u availability\u zones.azs.names[count.index]}“tags={Name=“pub sub-${count.index+1}}}
output“subnet\u id”{value=“${aws\u subnet.public\u subnet.*.id}”}
这有帮助吗?输出可能需要id而不是id。因为有多个。我对subnet\u id=>做了以下更改${module.public_subnets.subnet.id}并创建了一个输出--output“subnet_id”{value=“${aws_subnet.public_subnets.id}我得到了以下错误--错误:在输出“subnet_id”中,../modules/pub_subnets/output.tf第2行缺少资源实例键:2:value=“${aws_subnet.public_subnets.id}因为aws_subnet.public_subnet设置了“count”,所以必须在特定实例上访问其属性。例如,要与引用资源的索引关联,请使用:aws_subnet.public_subnet[count.index]您可以发布子网模块代码吗?根据错误消息,您正在创建多个子网,这将创建一个额外的质询。EC2实例只能在一个子网中启动。因此,需要一些额外的逻辑来确定要启动实例的子网。输出值可以更改为“${aws_subnet.some_subnet.*.id}以输出使用count方法创建的所有子网。但是,如果您想在每个子网中创建实例,则需要选择一个来启动实例。
resource aws_subnet“public_subnet”{count=2 vpc_id=“${var.vpc_id}”cidr_block=“${var.sub cdr[count.index]}”availability_zone=”${data.aws\u availability\u zones.azs.names[count.index]}“tags={Name=“pub sub-${count.index+1}}}
输出“subnet\u id”{value=“${aws\u subnet.public\u subnet.*.id}}
这有帮助吗?输出可能需要id而不是id。因为有多个id。