Использовать выходное значение в объекте terraform

#amazon-web-services #terraform #amazon-vpc #terraform-provider-aws

#amazon-веб-сервисы #terraform #amazon-vpc #terraform-provider-aws

Вопрос:

У меня есть несколько выходных переменных, я хочу создать одну родительскую выходную переменную, а затем поместить в нее другие выходные данные. Я искал об этом и обнаружил, что мы можем использовать terraform object для этого, но не можем получить правильный синтаксис. 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}"
}
  

Я хочу, чтобы мой вывод был в объекте, или вы можете сказать, родительской выходной переменной, которая имеет все дочерние выходные значения, я придумал несколько строк, которые, как я знаю, не соответствуют синтаксису, но дадут вам представление о том, о чем я думаю.

 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 })
}
  

Ответ №1:

У вывода Terraform нет type . Следовательно, ваш vpc должен быть:

 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}"
  }  
}
  

Но проблема в том, что дочерний модуль не имеет доступа к выводам своего parrent.Таким образом, я не совсем уверен, чего вы хотите достичь с помощью своих выходных данных. Обычно вы передаете переменные от родительского элемента к дочернему с помощью variable , а затем вы можете создать новый вывод из этих переменных в дочернем модуле.

Обновить

Основываясь на ваших предыдущих вопросах, существует main.tf с

 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
}
  

Следовательно, у вас должна быть папка ./modules/vpc . В папке может находиться файл с именем ./modules/vpc/vpc.tf . В файле будет что-то вроде этого (переменные также могут быть в отдельном файле):

 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
}
  

Если это так, то вы можете создать новый файл, вызываемый ./modules/vpc/output.tf с содержимым:

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

Комментарии:

1. как вы можете это сделать с помощью объекта terraform?

2. @Shifa Привет. Можете ли вы уточнить «сделать это»? Что делать?

3.Привет, Марчин, мой руководитель попросил меня использовать объект terraform в output.tf файл terraform.io/docs/configuration/types.html так что, если я хочу сослаться на выходные данные, я могу просто использовать "${module.vpc.vpc_id}" "${module.vpc.public_subnet}" , например, имя выходной переменной остается неизменным, и мы можем получить доступ к различным атрибутам, таким как vpc_id public_subnet и т.д.

4. Вы поняли мою мысль? Я провел большой поиск и не нашел никакого полезного материала

5. @Shifa Я пытаюсь собрать кусочки головоломки. Я помню VPC со вчерашнего дня. Думаю, я понимаю, что вы имеете в виду. Дайте мне несколько минут на проверку.