Возможно ли иметь условные аргументы в ресурсах terraform

#terraform #terraform-provider-aws

Вопрос:

Я пытаюсь настроить синхронизацию данных в AWS с расписанием, однако мне нужно расписание только в 2 средах, есть ли способ использовать условные аргументы, чтобы расписание устанавливалось только в dev и test.

 resource "aws_datasync_task" "data-load" {
  destination_location_arn = aws_datasync_location_s3.destination.arn
  name                     = "data-load"
  source_location_arn      = aws_datasync_location_nfs.source.arn

  schedule {
    schedule_expression = "cron(0 12 ? * SUN,WED *)"
  }
}
 

Я пытался

   schedule {
    schedule_expression = var.data_sync_schedule
  }


variables.tf:

variable "data_sync_schedule" {
  default = null
}

dev and test tfvars:

data_sync_schedule = "cron(0 8 * * ? *)"
 

но для всех других окружений, кроме dev test, я получаю следующую ошибку:

 ╷
│ Error: Missing required argument
│ 
│   with aws_datasync_task.data-load[0],
│   on data-sync.tf line 19, in resource "aws_datasync_task" "data-load":
│   19:     schedule_expression = var.data_sync_schedule
│ 
│ The argument "schedule.0.schedule_expression" is required, but no
│ definition was found.
 

Любые предложения будут с благодарностью приняты.

Ответ №1:

Вместо того, чтобы пытаться обнулить выражение расписания, вам нужно сделать весь aws_datasync_task ресурс условным. Вы можете сделать это с помощью аргумента count для ресурса, установив для него значение либо 0 или 1 .

Комментарии:

1. Мне все еще нужна синхронизация данных в других средах, я просто не хочу, чтобы они запускались по расписанию

2. Затем вам нужно сделать schedule блок динамическим блоком. terraform.io/docs/language/expressions/dynamic-blocks.html

Ответ №2:

Вы можете сделать следующее:

 resource "aws_datasync_task" "data-load" {
  destination_location_arn = aws_datasync_location_s3.destination.arn
  name                     = "data-load"
  source_location_arn      = aws_datasync_location_nfs.source.arn

  schedule {
    schedule_expression = var.env == 'dev' ? "cron(0 12 ? * SUN,WED *)" : null
  }
}
 

Var.env будет установлен через ваше задание CI / CD