Эффективная проверка переменных с помощью Terraform

Есть ли эффективный способ применить логику проверки к переменным, используемым в прогоне terraform? В частности, я хочу проверить длину и регистр некоторых переменных. Переменные представляют собой комбинацию переменных, объявленных в файлах tfvars, файлах variables.tf и собранных во время выполнения программой terraform.

Благодарю.

1 ответ

Пользовательские правила проверки

Полученные результаты

Случай отказа

provider aws {
     profile="default"
}
terraform {
  experiments = [variable_validation]
}

## Custom Validation Rules
variable "test" {
  type        = string
  description = "Example to test the case and length of the variable"
  default = "TEsT"

  validation {
    condition     = length(var.test) > 4 && upper(var.test) == var.test
    error_message = "Validation condition of the test variable did not meet."
  }
}

Исполнение

$ terraform plan

Warning: Experimental feature "variable_validation" is active

  on main.tf line 5, in terraform:
   5:   experiments = [variable_validation]

Experimental features are subject to breaking changes in future minor or patch
releases, based on feedback.

If you have feedback on the design of this feature, please open a GitHub issue
to discuss it.


Error: Invalid value for variable   # <---------------------------

  on main.tf line 9:
   9: variable "test" {

Validation condition of the test variable did not meet.

This was checked by the validation rule at main.tf:14,3-13.

Пропустить случай

terraform {
  experiments = [variable_validation]
}

## Custom Validation Rules
variable "test" {
  type        = string
  description = "Example to test the case and length of the variable"
  default = "TESTED"

  validation {
    condition     = length(var.test) > 4 && upper(var.test) == var.test
    error_message = "Validation condition of the test variable did not meet."
  }
}

Исполнение

$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

No changes. Infrastructure is up-to-date.

Другие

В качестве альтернативы используйте null_resource local-exec для реализации логики в сценарии оболочки или используйте внешний поставщик для отправки переменной во внешнюю программу для проверки?

Это не то, что вы в настоящее время можете сделать напрямую с Terraform, но я считаю, что проще просто перенести входные переменные в нужный формат, если это необходимо.

В качестве примера aws_lb_target_group ресурс занимает protocol параметр, который в настоящее время требует, чтобы он был в верхнем регистре, а не автоматически в верхнем регистре и не подавлял разницу aws_lb_listener ресурс делает для протокола (или даже protocol в health_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}"
}

Что касается проверки длины, я просто подставляю вещи, чтобы сделать их правильной длины. В настоящее время я делаю это для 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}"]
}

С учетом вышеизложенного любая комбинация длины имени среды или службы приведет к тому, что пара имен среды / службы будет обрезана максимум до 27 символов, что оставляет место для дополнительных символов, которые я хочу указать.

Вдохновленный этим разговором, я нашел следующего уже существующего провайдера:https://github.com/craigmonson/terraform-provider-validate

Другие вопросы по тегам