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では不可能ですか?
あなたが投稿してからしばらく経ちましたが、最近似たようなものが必要だったので、他の誰かがつまずいた場合に備えてここに解決策を投稿します。
(現在) lookup
関数 がテラフォーム補間構文でサポートされており、マップ内の動的キーを検索できます。
これを使用して、次のようなことができるようになりました。
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
は単純な文字列変数です。
以下は、terraformバージョン0.11.7で動作します。このソリューションでは map function を使用します。
resource "aws_instance" "web" {
...
tags = "${map(
"Name", "${var.role} ${var_env}",
"role", "${var.app_role}",
"${var.app_role}", "${var_env}"
)}"
}
最近、タグキーも動的に設定する必要があり、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インスタンスタイプを選択するためにどのように使用しているのかを示します。
の中に .tf
ファイル:
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
}
の中に .tfvars
ファイル:
...
environment = "testing"
...
受け入れられた回答は、既存のマップで動的ルックアップを行う方法を説明しています。 HCL2(0.12)では、ダイナミックキーを使用してマップを作成するために、キーで引用符付きの補間式を使用できます。
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
AMI = "${var.base_AMI}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = {
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
"${var.app_role}" = "${var.env}" # <------ like this
}
}
issue#21566 が修正されると、"${var.app_role}"
を(var.app_role)
に置き換えることができます。これは documentation で説明されている方法です。
(以下と同じ警告がここにも適用されます:var.app_role
がそれらのリテラルキーのいずれかをその値として含む場合、それはそれを置き換えます。)
受け入れられた回答は、既存のマップで動的ルックアップを行う方法を説明しています。 HCL2(0.12)でダイナミックキーを使用してマップを構築するには、2つの方法があります。
merge
式用 を使用してキーの1つ以上の変数からマップを動的に構築し、それを merge
function と組み合わせて構築できます静的キーと動的キーが混在した新しいマップ:
variable "app_role" {
type = string
}
locals {
tags = merge(
{
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
},
{
for k in [var.app_role]: k => "${var.env}"
}
)
}
zipmap
または、 zipmap
を使用して、ワンショットで構築できます。
locals {
tags = zipmap(
[
"Name",
"role",
var.app_role
],
[
"${var.role} ${var.env}",
var.app_role,
var.env
]
)
}
次に、リソースでこのマップを使用できます。
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
AMI = "${var.base_AMI}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = local.tags // or inline the above here
}
1つの注意点は、var.app_role
が"Name"
または"role"
のいずれかと等しい場合、静的な値が上書きされることです。これを避けるには、merge
の引数を交換するか、zipmap
のリストを並べ替えます。ただし、このような衝突は、適用前にキャッチして修正する必要がある設定エラーになる可能性が高くなります。
この機能はまだサポートされていません。