无法评估使用资源组数据源的地形模块



我已经写了一大堆模块,它们使用数据源来确定azure位置,这样就可以计算它,而不必提供它

函数_app父模块

data "azurerm_resource_group" "rg" {
name = var.resource_group_name
}
resource "azurerm_function_app" "function_app" {
location                        = data.azurerm_resource_group.rg.location
resource_group_name             = data.azurerm_resource_group.rg.name
....

资源组父模块

resource "azurerm_resource_group" "rg" {
name     = var.name
location = var.location
tags = var.tags
}
output "name" {
description = "The Resource Group name."
value       = azurerm_resource_group.rg.name
}
output "id" {
description = "The Resource Group id."
value       = azurerm_resource_group.rg.id
}
output "location" {
description = "The Resource Group location."
value       = azurerm_resource_group.rg.location
}

在使用模块时,我现在遇到了一个问题,即找不到资源组,因为terraform在应用之前会评估数据源:

功能应用程序子模块

module "rg" {
source   = "../"
name     = <name>
location = "Australia East"
tags     = var.tags
}

module "function_app" {
source = "../"
functionapp_name      = "Func-Testing"
app_service_plan_name = "testappserviceplan"
resource_group_name   = module.rg.name
os_type               = "linux"
...
│ Error: Error: Resource Group "<name>" was not found
│
│   with module.function_app.data.azurerm_resource_group.rg,
│   on .terraformmodulesfunction_appterraformazurerm_function_appdata.tf line 1, in data "azurerm_resource_group" "rg":
│    1: data "azurerm_resource_group" "rg" {

我通常会修复depends_on = [module.rg]的问题,但正如您可能知道的那样,这会创建显式依赖关系,现在我遇到了下一个计划想要重新创建一些资源的问题。显然使用";dependens_;会产生无法计算资源的副作用,因此必须重新创建资源才能获得值。我看到了";强制替换";下一个计划是这样的:

# module.vnet.azurerm_virtual_network.vnet must be replaced
-/+ resource "azurerm_virtual_network" "vnet" {
- flow_timeout_in_minutes = 0 -> null
~ guid                    = "<id>" -> (known after apply)
~ id                      = "/subscriptions/<sub-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/<vnet>" -> (known after apply)
~ location                = "australiaeast" -> (known after apply) # forces replacement
....

因此,在模块中为资源组提供数据源可能不是一个好主意。在我可以使用的子模块中,有人知道解决这个问题的方法吗?不使用";dependens_on";?而且我不需要重写很多模块:D。

问题的解决方案是从模块中正确output位置或资源组。这意味着您必须在模块中添加output,例如

output "rg" {
value = azurerm_resource_group.rg
}

然后在父模块中,您将其引用为:


module "test" {
source = "./mymodule"
}
resource "azurerm_function_app" "function_app" {
location                        = module.test.rg.location
resource_group_name             = module.test.rg.name

或者,您必须开始使用depends_on,正如您所指出的,这在您的情况下不是一个好的做法。

最新更新