我想将下面提到的安全规则块发送到安全组作为输入,是否可以在Terraform中使用?
ingress {
from_port = 5985
to_port = 5986
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
如果考虑变量,则可以从外部读取变量值
instance_type = ${var.instance_type}
在variable.tf中,我们声明instance_type。
同样,是否可以选择将以下提到的整个块发送到资源“ aws_security_group”“ allow_al”
ingress {
from_port = 5985
to_port = 5986
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
答案 0 :(得分:0)
不可能发送整个块,但是您可以定义一个变量,其类型是具有相似属性集的对象,然后使用该对象填充该块。
variable "ingress_rule" {
type = object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
})
}
resource "aws_security_group" "example" {
# ...
ingress {
from_port = var.ingress_rule.from_port
to_port = var.ingress_rule.to_port
protocol = var.ingress_rule.protocol
cidr_blocks = var.ingress_rule.cidr_blocks
}
}
以上假设您只需要一个ingress
块,并且只想让调用者自定义其内容。如果您想让调用者指定零个或多个ingress
块,则答案会稍微复杂一些,但遵循相同的原理:
variable "ingress_rules" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
}))
}
resource "aws_security_group" "example" {
# ...
dynamic "ingress" {
for_each = var.ingress_rules
content {
from_port = ingress.value.from_port
to_port = ingress.value.to_port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
}
这里的第一个显着区别是,变量现在被定义为对象列表,而不只是一个对象。第二个区别是它使用dynamic
blocks为该列表的每个元素动态生成一个ingress
块。
始终需要完全定义对象类型并定义它如何映射到资源块中的参数,因为这将使Terraform分别验证您自己的模块代码(无论您是否正确拼写了参数名称,是否具有正确的类型),然后从调用模块的对象或对象列表中获取值,从而在正确的源位置报告任何错误。