2017-10-12 76 views
1

我是新来的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

这里的两个名称有不同的用途,并且有不同的范围。

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

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

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

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

资源名称是您用来指在Terraform方面资源的名称。 name参数是在提供者的上下文中给予资源的名称。资源不必具有名称参数,例如AWS Elastic IP resource没有名称,因为AWS不允许您为其命名。像AWS Security group rule这样的资源的一些资源甚至不能将一对一资源转换为您可以命名的资源。

相关问题