web-dev-qa-db-ja.com

マップのリストをテラフォームの選択されたフィールド値のリストにマップします

リソースがcountパラメータを使用してterraformでマルチリソースを指定する場合、リソースインスタンスの専用フィールドのリスト/配列を提供する簡単な構文があります。

例えば

aws_subnet.foo.*.id

非常に多くのバージョンがあるため、マップのリストなど、複雑な構造を持つ変数を宣言することができます。

variable "data" {
  type = "list"
  default = [
    {
      id = "1"
      ...
    },
    {
      id = "10"
      ...
    }
  ]
}

私は、マルチリソースに対してできる変数に対して同じことをする可能性を探しています:配列要素のフィールド値の配列への配列の投影。

残念ながら

var.data.*.id

リソースに関しては機能しません。これを行う可能性はありますか?

11
Uwe Krüger

template_file はあなたを助けることができます。

data "template_file" "data_id" {
  count = "${length(var.data)}"
  template = "${lookup(var.data[count.index], "id")}"
}

次に、リストを取得します"${data.template_file.data_id.*.rendered}"、その要素は「id」の値です。

このようなインデックスで要素を取得できます

"${data.template_file.data_id.*.rendered[0]}"

またはfunction element()を介して

"${element(data.template_file.data_id.*.rendered, 0)}"
17
Bruce

執筆時点では、Terraformの補間言語には一般化された投影機能はありません。 「スプラット構文」は、リソースの特殊なケースとして実装されます。

深い構造は可能ですが、使用するにはまだ便利ではないため、物事を比較的平らに保つことをお勧めします。将来、この種の機能をより使いやすくするために、新しい言語機能が追加される可能性があります。

5
Martin Atkins

マップの問題のリストをバイパスするためにテンプレートレンダリングを使用する実用的なソリューションを見つけた場合:

resource "aws_instance" "k8s_master" {
  count                       = "${var.master_count}"
  AMI                         = "${var.AMI}"
  instance_type               = "${var.instance_type}"
  vpc_security_group_ids      = ["${aws_security_group.k8s_sg.id}"]
  associate_public_ip_address = false
  subnet_id                   = "${element(var.subnet_ids,count.index % length(var.subnet_ids))}"
  user_data                   = "${file("${path.root}/files/user_data.sh")}"
  iam_instance_profile        = "${aws_iam_instance_profile.master_profile.name}"

  tags = "${merge(
    local.k8s_tags,
    map(
      "Name", "k8s-master-${count.index}",
      "Environment", "${var.environment}"
    )
  )}"
}

data "template_file" "k8s_master_names" {
  count    = "${var.master_count}"
  template = "${lookup(aws_instance.k8s_master.*.tags[count.index], "Name")}"
}

output "k8s_master_name" {
  value = [
    "${data.template_file.k8s_master_names.*.rendered}",
  ]
}

これにより、次の出力が生成されます。

k8s_master_name = [
    k8s-master-0,
    k8s-master-1,
    k8s-master-2
]
2
Boeboe