在地形中识别正确的变量类型



我正在使用下面的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的元素的相应属性填充的protocolports自变量。Terraform将在将配置传递给提供商进行验证/规划之前,用真正的allow块替换它:

allow {
protocol = "tcp"
ports    = ["80"]
}

相关内容

  • 没有找到相关文章

最新更新