web-dev-qa-db-ja.com

Terraform 0.12では、リソース名が既に存在する場合、リソースの作成をスキップする方法は?

Terraformバージョン0.12を使用しています。同じ名前のリソースがすでに存在する場合、リソースの作成をスキップする必要があります。

私はこれのために次のことをしました:

カスタム画像のリストを読んで、

data "ibm_is_images" "custom_images" {
}

画像がすでに存在するかどうかを確認し、

locals {
 custom_vsi_image = contains([for x in data.ibm_is_images.custom_images.images: "true" if x.visibility == "private" && x.name == var.vnf_vpc_image_name], "true")
}

output "abc" {
value="${local.custom_vsi_image}"
}

画像が存在する場合のみ作成します。

resource "ibm_is_image" "custom_image" {
  count            = "${local.custom_vsi_image == true ? 0 : 1}"
  depends_on       = ["data.ibm_is_images.custom_images"]
  href             = "${local.image_url}"
  name             = "${var.vnf_vpc_image_name}"
  operating_system = "centos-7-AMD64"

  timeouts {
    create = "30m"
    delete = "10m"
  }
}

これは「テラフォーム適用」で初めて正常に機能します。画像が存在しないことがわかり、画像を作成します。

2回目に「terraform apply」を実行すると、上で作成したリソース「custom_image」を削除しています。 2回目に実行したときにリソースが削除される理由は何ですか?

また、ある条件に基づいてリソースが作成される方法(それが存在しない場合のみなど)は?

2
Malar Kandasamy

Terraformでは、特定のオブジェクトの管理を担当するシステムを明示的に決定する必要があります。逆に、既存のオブジェクトを消費しているだけ 。その決定を動的に行う方法はありません。その結果は結果が非決定的となり、Terraformによって管理されるオブジェクトの場合、どの構成のterraform destroyがオブジェクトを破棄するかを明確にしないためです。

実際、その非決定性が、リソースの作成と削除の試行の間でフロップフォームが発生する理由です。Terraformに、そのオブジェクトがまだ存在しない場合にのみそのオブジェクトを管理するように指示しました。 Terraformの存在後に初めて実行すると、Terraformはオブジェクトが管理されていないことを確認するため、オブジェクトを破棄する予定です。


Terraformですべてを管理することが目標である場合、重要な設計タスクは、Terraform構成内および構成間でオブジェクトの依存関係がどのように流れるかを決定することです。あなたの場合、イメージを管理するシステム(Terraform構成の場合もそうでない場合もあります)と、既存のイメージを使用する1つ以上のTerraform構成の間にプロデューサー/コンシューマーの関係があるようです。

画像がTerraformによって管理されている場合、メインのTerraform構成は画像が存在する存在しないと想定し、無条件に作成する必要があることを示唆しています-決定した場合画像は、それを消費するシステムと同じシステムによって所有されているということです-または、画像がすでに存在すると想定し、それに関する情報を取得する必要がありますdataブロックを使用します。

ここで可能な解決策は、イメージを管理する別のTerraform構成を記述し、そのオブジェクトがすでに存在することが予期されていない状況でのみその構成を適用することです。次に、既存のイメージを使用する構成は、他のTerraform構成によって作成されたかどうかを気にせずに、そのイメージが存在すると仮定することができます。

Terraformのドキュメントセクション モジュール構成 、特にサブセクション オブジェクトの条件付き作成 に、この状況のより長い概要があります。そのガイドは単一の構成でのモジュール間の相互作用に焦点を当てていますが、同じ基礎となる原則が依存関係between構成(データソース経由)にも適用されます。

9
Martin Atkins