Извлечение блоков кода как переменных в Terraform - PullRequest
0 голосов
/ 07 ноября 2018

У меня сейчас есть какая-то терраформа, которая выглядит так:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

Проблема в том, что этот блок кода довольно большой, и множество тегов являются общими для нескольких ASG, поэтому, чтобы попытаться сократить его до чего-то более управляемого и уменьшить дублирование, я хочу сделать что-то подобное с общими тегами :

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = "${var.managed_by_tag}"
}

variable "managed_by_tag" {
  type = "map"
  default = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

К сожалению, когда я запускаю terraform apply, я получаю следующую ошибку:

Error: Error loading C:\path\to\file.tf: Error reading config for aws_autoscaling_group[my_asg]: At 32:9: unknown slice type: *ast.LiteralType

Из этой ошибки видно, что проблема в том, что она пытается поместить предмет неправильного типа - в данном случае карту - в место, где оно не принадлежит. Но я запутался в том, что следующее работает корректно и подразумевает (по крайней мере для меня, как нуб-терраформа), что карта должна быть в порядке:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}

Итак, мои вопросы:

  1. Есть ли способ извлечь эти теги в переменные?
  2. Почему мой подход выше не работает?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Посмотрите ближе на tag = "${var.managed_by_tag}": Вы интерполируете карту в строку, которую затем пытаетесь использовать там, где Terraform хочет карту.

Попробуйте вместо этого:

 resource "aws_autoscaling_group" "my_asg" {
   ...
   tag = var.managed_by_tag
 }
0 голосов
/ 08 ноября 2018

Переменная, которую вы используете для общих тегов, объявлена ​​правильно, это просто способ передачи ее в блок кода тега. То, как вы пытаетесь интерполировать, передает теги неправильного типа, если вы используете функцию слияния, это вернет ее в правильном формате. Вы можете увидеть это в документе ниже,

Интерполяция - объединение

tags = "${merge(var.managed_by_tag)}"

...