web-dev-qa-db-ja.com

Terraformの条件付き属性

Terraformは条件付き属性をサポートしていますか?変数の値に応じた属性のみを使用したい。

例:

resource "aws_ebs_volume" "my_volume" {
  availability_zone = "xyz"
  size              = 30

  if ${var.staging_mode} == true:
    snapshot_id = "a_specific_snapshot_id"
  endif
}

上記のifステートメントで属性snapshot_idを囲んでいるのが、私が探しているものです。 Terraformは、変数の値に基づくそのような属性の包含をサポートしていますか?.

6
Basil Musa

Terraform 0.12(まだリリースされていません)も HCL2のサポート をもたらします。これにより、次のようなものでnull許容引数を使用できます。

resource "aws_ebs_volume" "my_volume" {
  availability_zone = "xyz"
  size              = 30
  snapshot_id       = "staging_mode ? a_specific_snapshot_id : null"
}

Null可能引数は この0.12プレビューガイド で説明されています。

今のところ、0.12より前では、 Markusanswer がおそらく最善の策ですが、次のようなcountをもっと明示的に示します。

resource "aws_ebs_volume" "staging_volume" {
   count=${var.staging_mode ? 1 : 0}
   availability_zone = "xyz"
   size = 30

   snapshot_id = "a_specific_snapshot_id"
}

resource "aws_ebs_volume" "non_staging_volume" {
   count=${var.staging_mode ? 0 : 1}
   availability_zone = "xyz"
   size = 30
}

リソース名は一意である必要があることに注意してください。そうしないと、Terraformが文句を言います。 前の0.12三進式は遅延ではない のようにaws_volume_attachmentなどを使用してEBSボリュームを参照する必要がある場合、これにより問題が発生するため、次のようなものが機能しません。

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdh"
  volume_id   = "${var.staging_mode ? aws_ebs_volume.staging_volume.id : aws_ebs_volume.non_staging_volume.id}"
  instance_id = "${aws_instance.web.id}"
}

それは、任意の時点で有効なのは1つだけである三項の両側を評価しようとするためです。 Terraform 0.12では、これは当てはまりませんが、null可能引数を使用すると、より簡単に解決できます。

2
ydaetskcoR

私はそのような機能を認識していませんが、ケースがあまり複雑でない場合は、この機能を使用してモデル化できます。ブール値trueおよびfalse1および0と見なされるため、カウント内で使用できます。だからあなたは使うかもしれません

provider "null" {}

resource "null_resource" "test1" {
   count= ${var.condition ? 1 : 0}
}
resource "null_resource" "test2" {
   count = ${var.condition ? 0 : 1}
}

output "out" {
    value = "${var.condition ? join(",",null_resource.test1.*.id) : join(",",null_resource.test2.*.id) }"
}

count属性により、2つのリソースのうち1つだけが作成されます。

値にはjoinを使用する必要があります。これは、2つの値のいずれかの存在を適切に処理するためです。

ありがとう ydaetskcor 指摘してくれた その答え 変数処理の改善。

2
Markus