Переменные ключи в картах 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}"
)}"
}