如何从外部发送资源模块的块

时间:2019-08-29 04:32:56

标签: terraform

我想将下面提到的安全规则块发送到安全组作为输入,是否可以在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"]

}

1 个答案:

答案 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分别验证您自己的模块代码(无论您是否正确拼写了参数名称,是否具有正确的类型),然后从调用模块的对象或对象列表中获取值,从而在正确的源位置报告任何错误。