使用 Terraform 进行高效的变量验证

Bob*_*Bob 5 terraform hcl

是否有一种有效的方法可以将验证逻辑应用于 terraform 运行中使用的变量?具体来说,我想检查一些变量的长度和大小写。这些变量是在 tfvars 文件、variables.tf 文件中声明的变量的组合,并在运行时由 terraform 收集。

谢谢。

yda*_*coR 1

目前您无法直接使用 Terraform 执行此操作,但我发现如果需要,将输入变量更改为所需的格式会更容易。

作为一个例子,aws_lb_target_group资源采用的protocol参数当前要求它是大写的,而不是自动大写的,并像aws_lb_listener资源对协议(甚至protocolhealth_check块中)所做的那样抑制差异。

为了解决这个问题,我只是在创建资源时使用该upper函数:

variable "protocol" {
  default = "http"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_lb_target_group" "test" {
  name     = "tf-example-lb-tg"
  port     = 80
  protocol = "${upper(var.protocol)}"
  vpc_id   = "${aws_vpc.main.id}"
}
Run Code Online (Sandbox Code Playgroud)

至于检查长度,我只是对事物进行子串以使它们的长度正确。我目前对 ALB 执行此操作,因为名称的最大长度为 32,并且我让 Gitlab CI 为某些服务创建审核环境,这些服务根据 Git 分支名称的别名获取名称,因此对所使用的长度几乎没有控制。

variable "environment" {}
variable "service_name" {}

variable "internal" {
  default = true
}

resource "aws_lb" "load_balancer" {
  name            = "${substr(var.environment, 0, min(length(var.environment), 27 - length(var.service_name)))}-${var.service_name}-${var.internal ? "int" : "ext"}"
  internal        = "${var.internal}"
  security_groups = ["${aws_security_group.load_balancer.id}"]
  subnets         = ["${data.aws_subnet_ids.selected.ids}"]
}
Run Code Online (Sandbox Code Playgroud)

通过上述内容,环境或服务名称长度的任何组合都将导致环境/服务名称对被修剪为最多 27 个字符,从而为我想要指定的额外字符留出空间。