Необязательный аргумент в вызове модуля, если переменная карты не является пустым объектом - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий модуль, который создает приватное ведро. Я хочу использовать ведение журнала, только когда я определяю непустой аргумент logging в вызове моего модуля:

variable "tags" {
  description = "A mapping of tags to assign to the bucket."
  type        = "map"
  default     = {}
}

variable "logging" {
  description = "A mapping of logging to assign to the bucket."
  type        = "map"
  default     = {}
}

resource "aws_s3_bucket" "private_bucket" {
  bucket  = "${var.bucket}"
  acl     = "private"
  policy  = "${data.aws_iam_policy_document.policy.json}"
  tags    = "${var.tags}"
  # logging = "${var.logging}"
  logging = "${length(keys(var.logging)) > 0 ? var.logging : null}"

  # ...

  # This block is replaced by the argument
  /* logging {
    target_bucket = "${var.logging_bucket}"
    target_prefix = "s3/${local.bucket_id}/"
  } */

  # ...
}

Однако это не работает. Я называю модуль так:

module "private_bucket" {
  source = "modules/private-bucket"
  bucket = "${local.private_bucket_name}"

  tags {
    Name        = "Serverless stack private bucket"
    Environment = "${local.stage}"
  }
}

Почему высокоуровневый if-else не реализован в Terraform? Есть ли альтернатива для инициализации переменной в модуле / ресурсе условным, а не только ее значением?

Edit:

Вот псевдокод, чего я хочу достичь:

resource "aws_s3_bucket" "private_bucket" {
  bucket  = "${var.bucket}"
  acl     = "private"
  policy  = "${data.aws_iam_policy_document.policy.json}"
  tags    = "${var.tags}"

  # if var.logging is not an empty object,
  # then initialize logging with the object
  if (var.logging != {}) {
    logging = "${var.logging}"
  }

  # ...
}

1 Ответ

0 голосов
/ 01 марта 2019

Вы не можете использовать карты в разделах then или else. Я думаю, что Terraform 0.12 может быть более гибким.

Я сделал то же самое в Azure, и в итоге я использовал функцию слияния в разделе localals {}, где var.tags по умолчанию {}:

tags    = "${merge(data.azurerm_resource_group.env.tags, var.tags)}"

Затем я использую ${local.tags} против блоков ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...