Переменные ключи в картах terraform

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

resource "aws_instance" "web" {
    ami = "${var.base_ami}"
    availability_zone = "${var.region_a}"
    instance_type = "${var.ec2_instance_size}"
    security_groups = ["sec1"]
    count = "${var.ec2_instance_count}"
    tags {
        Name = "${var.role} ${var_env}"
        role = "${var.app_role}"
        ${var.app_role} = "${var_env}"
    }
}

и так:

tags {
   Name = "${var.role} ${var_env}"
}
tags."${var.role}" = "${var.env}"

какие идеи? Разве это невозможно с Terraform в настоящее время?

5 ответов


Я знаю, что прошло некоторое время с тех пор, как вы опубликовали, но мне недавно нужно было что-то подобное, поэтому я размещаю решение здесь, Если кто-то еще наткнется на него.

там (сейчас)lookup функции поддерживается в синтаксисе интерполяции terraform, что позволяет искать динамические ключи на карте.

используя это, я теперь могу делать такие вещи, как:

output "image_bucket_name" {
  value = "${lookup(var.image_bucket_names, var.environment, "No way this should happen")}"
}

, где:

variable "image_bucket_names" {
  type = "map"

  default = {
    development = "bucket-dev"
    staging = "bucket-for-staging"
    preprod = "bucket-name-for-preprod"
    production = "bucket-for-production"
  }

}

и environment - простая строковая переменная.


мне недавно нужно было установить ключ тега динамически, и мне удалось сделать это с помощью zipmap:

locals {
  ec2_tag_keys = ["some/prefix/${var.some_var}", "another_tag"]
  ec2_tag_vals = ["some value", "another value"]
}

resource "aws_instance", "foo" {
  ...
  tags = "${zipmap(local.ec2_tag_keys, local.ec2_tag_vals)}"
}

это немного неуклюже, но это работает.


эта функция еще не поддерживается.


Я не уверен, когда он был добавлен, но, по крайней мере, с версии 0.11.7, Terraform поддерживает использование переменных в качестве ключей карты. Вот пример того, как я использую его для выбора типа экземпляра AWS:

на :

variable "environment" {}

...

variable "instance_types_webserver" {
  type = "map"

  default = {
    testing    = "t2.small"
    qa         = "t2.medium"
    staging    = "t2.xlarge"
    production = "t2.xlarge"
  }
}

...

resource "aws_opsworks_instance" "verification" {
  stack_id      = "${aws_opsworks_stack.verification.id}"
  layer_ids     = ["${aws_opsworks_custom_layer.verification.id}"]
  instance_type = "${var.instance_types_webserver["${var.environment}"]}"
  state         = "running"
  count         = 1
}

на :

...
environment = "testing"
...

следующее работает с terraform версии 0.11.7. Это решение использует функции карте.

resource "aws_instance" "web" {
  ...
  tags = "${map(
    "Name", "${var.role} ${var_env}",
    "role", "${var.app_role}",
    "${var.app_role}", "${var_env}"
  )}"
}