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

时间:2017-10-12 18:03:14

标签: terraform

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

resource "azurerm_resource_group" "group_name" {
  name     = "group_name" # <-- repeated!
  location = "${local.location}"
}

有区别吗?我能否以某种方式将它们设置为相同的精神:

resource "azurerm_resource_group" "group_name" {
  name     = "${name}"
  location = "${local.location}"
}

2 个答案:

答案 0 :(得分:3)

这里的两个名字用途不同,范围也不同。

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

块中的name 是特定于资源类型本身的属性 - 在这种情况下为azurerm_resource_group。此名称将发送到远程API,并将在AzureRM系统本身中描述对象的方式。

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

  • 如果有多个单独的团队或应用程序共享AzureRM帐户,则API使用的名称可能需要加上前缀以避免与其他团队或应用程序创建的名称冲突,而本地名称只需要在它所定义的模块。
  • 在使用子模块的更复杂的用法中,多次实例化相同的子模块是很常见的。在这种情况下,所有实例之间的本地名称将是相同的(因为它仅在该实例中具有重要意义),但是需要针对每个实例调整API使用的名称,以便它们不会在#39 ; t碰撞。

答案 1 :(得分:1)

资源名称是您在Terraform上下文中引用资源的名称。 name参数是提供者上下文中的资源名称。资源不必具有名称参数,例如AWS Elastic IP resource没有名称,因为AWS不允许您为其命名。某些资源(如AWS Security group rule)甚至不能将一对一翻译成您可以命名的资源。