web-dev-qa-db-ja.com

テラフォームマップの変数キー

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では不可能ですか?

11
JoeyP

あなたが投稿してからしばらく経ちましたが、最近似たようなものが必要だったので、他の誰かがつまずいた場合に備えてここに解決策を投稿します。

(現在) 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は単純な文字列変数です。

22
gsaslis

以下は、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}"
  )}"
}
6
lander2k2

最近、タグキーも動的に設定する必要があり、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)}"
}

少し不格好ですが、動作します。

3
scottatron

いつ追加されたのかはわかりませんが、少なくともバージョン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"
...
1
Matt Lewin

更新

受け入れられた回答は、既存のマップで動的ルックアップを行う方法を説明しています。 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のリストを並べ替えます。ただし、このような衝突は、適用前にキャッチして修正する必要がある設定エラーになる可能性が高くなります。

1
tavnab

この機能はまだサポートされていません。

1
padmakarojha