我正在使用下面的gcp terraform module
来使用terraform
创建gcp firewall
规则
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_firewall
我需要一些帮助来为防火墙规则中的allow
参数定义正确的data type
参数值的示例如下
fw_dst_tags = "http,https"
fw_allow = [{
protocol = "tcp"
ports = ["80"]
}]
为此,我创建了一个变量类型pflist(object)
,如下所示
variable "target_tags" {
type = list
}
variable "allow" {
type = list(object({
protocol = string,
ports = list(string,)
}))
}
但它失败了,错误低于
Error: Unsupported argument
│
│ on ../../modules/fw/fw.tf line 12, in resource "google_compute_firewall" "main":
│ 12: allow = var.allow
│
│ An argument named "allow" is not expected here. Did you mean to define a block of type "allow"?
识别以下类型值的正确变量的任何帮助
fw_allow = [{
protocol = "tcp"
ports = ["80"]
}]
google_compute_firewall
的文档对此并不十分清楚,但它确实提到allow
是一个块类型,而不是一个简单的参数:
allow
块支持:
protocol
-(必需(此规则适用的IP协议。创建防火墙规则时需要协议类型。该值可以是以下众所周知的协议字符串之一(tcp、udp、icmp、esp、ah、sctp、ipip、all(,也可以是IP协议号ports
-(可选(适用此规则的端口的可选列表。此字段仅适用于UDP或TCP协议。每个条目必须是一个整数或一个范围。如果未指定,此规则适用于通过任何端口的连接。示例输入包括:["22"]、["80"、"443"]和["12345-12349"]
即使提供程序文档对此不够清楚,如果给定一个特定名称为单数名称而不是复数名称,但预期会有多个该类型的对象,则通常也可以假设该名称为块类型。在这种情况下,每个对象都表示为该类型的单独块。然而,这种启发式方法在这种情况下并没有真正的帮助,因为allow
是一个动词而不是名词,因此它作为参数名称和块类型名称同样有效。
您可以在Terraform文档的Arguments和blocks部分阅读更多关于块的信息。不过,出于您的目的,您正在专门寻找根据var.allow
值中的元素数量动态声明零个或多个allow
块的语法。为此,您需要dynamic
块,它是用于将多个块动态声明为某种宏或模板的语法结构。
dynamic "allow" {
for_each = var.allow
content {
protocol = allow.value.protocol
ports = allow.value.ports
}
}
上面说应该为var.allow
的每个元素生成一个allow
块,并且在每个块内应该有使用来自var.allow
的元素的相应属性填充的protocol
和ports
自变量。Terraform将在将配置传递给提供商进行验证/规划之前,用真正的allow
块替换它:
allow {
protocol = "tcp"
ports = ["80"]
}