2016-02-18 4 views
4

В 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 это невозможно?

+0

Я буду очень удивлен, если эта функция поддерживается. –

+2

Если я правильно понимаю, я не считаю, что можно установить переменные как ключи. [Mapping] (https://www.terraform.io/docs/configuration/interpolation.html#lookup_map_key_) с переменными возможно. Другим примером является [здесь] (https://www.terraform.io/intro/getting-started/variables.html). –

ответ

8

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

Существует (сейчас) lookup function, поддерживаемый в синтаксисе интерполяции 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 является простой строковой переменной.

1

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

+1

«Не поддерживается» * является действительным ответом. Хотя, когда это возможно, полезно поддержать это с некоторой документацией. – Leigh

1

Недавно я должен был установить ключ тегов динамически тоже, и удалось сделать это с помощью 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)}" 
} 

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