1. ホーム
  2. azure

[解決済み] Terraformのdepends_onとモジュール

2022-03-15 15:04:56

質問

テラフォームの初心者ですが、モジュール構造でazureのカスタムポリシーを作成しました。 各ポリシーがカスタムモジュールを表しています。 私が作成したモジュールの1つは、新しいazureリソースが作成されると診断ログを有効にすることです。 しかし、私はそれのためのストレージアカウントが必要です。(診断設定を有効にする前に、私はどのように実装することができますか? depend_on"または他のメソッド? まずストレージアカウントを作成し、次に診断設定のモジュールを作成したいのですが。 その際 main.tf (他のすべてのモジュールを呼び出す場所)またはリソース(モジュール)の内部?

助けてくれてありがとうございます! :)

この下のコードはmain.tfファイルを表しています。

//calling the create storage account name

module "createstorageaccount" {

source = "./modules/module_create_storage_account"
    depends_on = [
    "module_enable_diagnostics_logs"
  ]

}

これは、Create Storage Account モジュールを表しています。

resource "azurerm_resource_group" "management" {


  name     = "management-rg"
  location = "West Europe"
}

resource "azurerm_storage_account" "test" {
  name                     = "diagnostics${azurerm_resource_group.management.name}"
  resource_group_name      = "${azurerm_resource_group.management.name}"
  location                 = "${azurerm_resource_group.management.location}"
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "diagnostics"
  }
}

    depends_on = [
    "module_enable_diagnostics_logs"
  ]


解決方法は?

ほとんどの場合、必要な依存関係は、参照の結果として自動的に発生します。あるリソースの設定が他のリソースを直接または間接的に参照している場合、Terraformは自動的にそれらの間の依存関係を推論し、明示的な depends_on .

これは、モジュールの変数と出力が依存関係グラフのノードでもあるため、機能します。 var.foo という変数があり、その変数の値が依存しているものに間接的に依存していることになります。

自動的な依存関係の検出が不十分な稀な状況では、モジュール変数と出力が依存関係グラフのノードであるという事実を利用して、間接的な 明示的 のような依存関係があります。

variable "storage_account_depends_on" {
  # the value doesn't matter; we're just using this variable
  # to propagate dependencies.
  type    = any
  default = []
}

resource "azurerm_storage_account" "test" {
  name                     = "diagnostics${azurerm_resource_group.management.name}"
  resource_group_name      = "${azurerm_resource_group.management.name}"
  location                 = "${azurerm_resource_group.management.location}"
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "diagnostics"
  }

  # This resource depends on whatever the variable
  # depends on, indirectly. This is the same
  # as using var.storage_account_depends_on in
  # an expression above, but for situations where
  # we don't actually need the value.
  depends_on = [var.storage_account_depends_on]
}

このモジュールを呼び出すと storage_account_depends_on には、 ストレージアカウントよりも先に作成されることを保証したいオブジェクトを含む任意の式を指定します。

module "diagnostic_logs" {
  source = "./modules/diagnostic_logs"
}

module "storage_account" {
  source = "./modules/storage_account"

  storage_account_depends_on = [module.diagnostic_logs.logging]
}

そして diagnostic_logs モジュールの間接的な依存関係を設定することができます。 logging を出力して、モジュール間の依存関係のリンクを完成させます。

output "logging" {
  # Again, the value is not important because we're just
  # using this for its dependencies.
  value = {}

  # Anything that refers to this output must wait until
  # the actions for azurerm_monitor_diagnostic_setting.example
  # to have completed first.
  depends_on = [azurerm_monitor_diagnostic_setting.example]
}

リレーションシップを表現するために、実際の 例えば、idを含む出力があれば、その方が分かりやすい構成になるので、そちらをお勧めします。しかし、データフローとしてモデル化できないリソース間の関係があるような稀な状況では、出力や変数を使ってモジュール間の依存関係を明示的に伝播させることも可能です。