为什么有些资源有名称和“名称”属性?

bar*_*ara 6 terraform

我是 Terraform 的新手,正在尝试在 Azure 上创建一些资源。name对我来说,定义中的资源名称和属性之间似乎存在一些不必要的重复。

resource "azurerm_resource_group" "group_name" {
  name     = "group_name" # <-- repeated!
  location = "${local.location}"
}
Run Code Online (Sandbox Code Playgroud)

有区别吗?我可以本着这样的精神将它们设置为相同吗:

resource "azurerm_resource_group" "group_name" {
  name     = "${name}"
  location = "${local.location}"
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 11

这里的两个名称有不同的用途和不同的范围。

块头中显示的名称是单个 Terraform 模块中使用的本地名称。当将结果从一种资源插入另一种资源时(例如${azurerm_resource_group.group_name}. 远程 API 永远不会看到这个名称;它仅用于内部参考。

在本例中,块name 内的属性是特定于资源类型本身的属性azurerm_resource_group。该名称将被发送到远程 API,并将成为 AzureRM 系统本身描述对象的方式。

在小型组织内的简单配置中,这两个名称确实有可能匹配。在实践中,这些名称之间的范围差异导致它们经常发生变化。例如:

  • 如果有多个单独的团队或应用程序共享 AzureRM 帐户,则 API 使用的名称可能需要添加前缀,以避免与其他团队或应用程序创建的名称发生冲突,而本地名称仅在其所在的模块内必须是唯一的定义的。
  • 在更复杂的子模块使用中,通常会多次实例化同一个子模块。在这种情况下,所有实例之间的本地名称都是相同的(因为它仅在该实例中才有意义),但需要针对每个实例调整 API 使用的名称,以便它们不会发生冲突。