#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 со вчерашнего дня. Думаю, я понимаю, что вы имеете в виду. Дайте мне несколько минут на проверку.