简体   繁体   中英

Use output value in terraform object

I have multiple output variable, I want to make one parent out variable and then put other outputs into it. I have searched about it and found that we can user terraform object for it but can't get the syntax right. Output.tf

output "public_subnet" {
  value = "${module.my_vpc.public_subnets_ids}"
}
output "vpc_id" {
  value = "${module.my_vpc.vpc_id}"
}
output "private_subnet" {
  value = "${module.my_vpc.private_subnets_ids}"
}

I want my output to be in a object or you can say parent output variable that have all child output vales, I have come up with few line which I know is not right syntax wise but will get you a picture of what I am thinking of.

output "vpc" {
  value = {
    vpc_id         = "${module.my_vpc.vpc_id}"
    public_subnet  = "${module.my_vpc.public_subnets_ids}"
    private_subnet = "${module.my_vpc.private_subnets_ids}"
  }
  type = object({ vpc_id = string, public_subnet = string, private_subnet = string })
}

Terraform output does not have type . Therefore, your vpc should be:

output "vpc" {
  value = {
    vpc_id         = "${module.my_vpc.vpc_id}"
    public_subnet  = "${module.my_vpc.public_subnets_ids}"
    private_subnet = "${module.my_vpc.private_subnets_ids}"
  }  
}

But the issue is that a child module has no access to its parrent's outputs. Thus, I'm not exactly sure what do you want to achieve with your outputs. Normally, you would pass variables from parent to child using variable , and then you could make new output from those variables in the child module.

Update

Based on your previous questions, there is main.tf with

module "my_vpc" {
  source            = "./modules/vpc"
  vpc_cidr          = var.vpc_cidr
  public_subnet     = var.public_subnet
  private_subnet    = var.private_subnet
  availability_zone = data.aws_availability_zones.azs.names
}

Therefore, you must have a folder ./modules/vpc . In the folder, there may be a file called ./modules/vpc/vpc.tf . The file will have something like this in it (variables could be in separate file as well):

variable "vpc_cidr" {}

variable "public_subnet" {}

variable "private_subnet" {}

variable "availability_zone" {}

# the rest of the VPC definition. Since the file is not given,
# i can only speculate on the exact details of the content

resource "aws_subnet" "public" {

  count  = length(var.public_subnet)

  vpc_id = aws_vpc.my_vpc.id

  # other attributes
}

resource "aws_subnet" "private" {

  count  = length(var.private_subnet)

  vpc_id = aws_vpc.my_vpc.id

  # other attributes
}

If so, then you can create a new file, called ./modules/vpc/output.tf with the content:

output "vpc" {
  value = {
    vpc_id         = my_vpc.vpc_id
    public_subnet  = aws_subnet.public.*.id
    private_subnet = aws_subnet.private.*.id
  }  
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM