我试图理解在输出部分使用Concat函数的好处。因为我有实验输出部分有和没有Concat。但我看不出有什么不同。
例子resource "aws_security_group" "sg_22" {
name = "sgx_22"
vpc_id = var.vpc
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group" "sg_8080" {
name = "sgx_8080"
vpc_id = var.vpc
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
output "web_security_group_ids" {
value = concat([aws_security_group.sg_22.id, aws_security_group.sg_8080.id])
}
和
resource "aws_security_group" "sg_22" {
name = "sgx_22"
vpc_id = var.vpc
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group" "sg_8080" {
name = "sgx_8080"
vpc_id = var.vpc
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
output "web_security_group_ids" {
value = [aws_security_group.sg_22.id, aws_security_group.sg_8080.id]
}
在这两种情况下,Terraform以相同的格式给出相同的输出。任何想法?
这是学习指南中的一个错误。concat
函数"concatenates";将两个不同的参数列表合并为一个列表,其中包含每个列表的所有元素。在本例中,您有一个包含两个列表的单个列表作为concat
函数的参数。我认为指南应该提到的实际功能是flatten
。这个函数将"扁平化"。冗余嵌套列表到单个列表中:
output "web_security_group_ids" {
value = flatten([aws_security_group.sg_22.id, aws_security_group.sg_8080.id])
}
然而,这仍然是相当无意义的,因为它是嵌套列表的唯一原因是两个列表是列表构造函数的参数。或者,指南实际上可能意味着直接连接两个列表:
output "web_security_group_ids" {
value = concat(aws_security_group.sg_22.id, aws_security_group.sg_8080.id)
}
定义此输出的实际最佳方法是简单地使用与resource参数相关的resource属性。这将是输出中的一个简单定义,一个单独的列表,并保证根据参数的更改动态更新。
output "web_security_group_ids" {
value = aws_instance.web.vpc_security_group_ids
}