Есть ли способ игнорировать необязательное поле в модуле terraform, когда значение не указано?

#terraform

#terraform

Вопрос:

Я управляю функциями AWS lambda с помощью модуля terraform. Теперь я хочу добавить dead_letter_config к одной из лямбда-функций, но оставить другие функции без изменений.

Я пытаюсь добавить dead_letter_config поле (которое является необязательным в aws_lambda_function ресурсе) в модуль, но я не могу найти, как я могу сделать dead_letter_config поле доступным только в определенной лямбда-функции и заставить это поле игнорироваться другими вызывающими.
Моя terraform — версия 0.12.28, поэтому я попытался использовать null значение по умолчанию для переменной.

 resource "aws_lambda_function" "lambda" {
...
  dead_letter_config {
    target_arn = var.dead_letter_config_target
  }
  
 variable "dead_letter_config_target" {
  default     = null
  type        = string
}
  

Но target_arn поле требуется для dead_letter_queue поля, поэтому terraform plan сбой.

 Error: "dead_letter_config.0.target_arn": required field is not set
  

Есть ли какой-нибудь хороший способ условно игнорировать все поле целиком?

Ответ №1:

ДА. Для этого вы можете использовать динамический блок. В принципе, когда dead_letter_config_target равно null, не dead_letter_config будет создано. В противном случае будет создан один dead_letter_config блок.

Например, измененный код может быть:

 resource "aws_lambda_function" "lambda_tf" {

  # other attributes
  
  dynamic "dead_letter_config" {

    for_each = var.dead_letter_config_target != null ? toset([1]) : toset([])

    content {
      target_arn = var.dead_letter_config_target
    }
  }  
}
  

P.S.

Для DLQ вам, очевидно, потребуется настроить разрешения в роли выполнения lambda.

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

1. Спасибо! Это становится хорошим шансом изучить динамический блок.

Ответ №2:

Оператор Terraform «splat» [*] может использоваться как удобный способ преобразования значения, которое может быть либо заданным, либо нулевым, в список нулевой длины или одноэлементный список, который затем удобнее использовать с функциями языка Terraform, ориентированными на коллекции, такими, например, как dynamic блоки:

 resource "aws_lambda_function" "lambda" {
  # ...
  
  dynamic "dead_letter_config" {
    for_each = var.dead_letter_config_target[*]

    content {
      target_arn = each.value
    }
  }  
}