【问题标题】:Terraform .id explanationTerraform .id 解释
【发布时间】:2019-02-16 23:18:41
【问题描述】:

我是 Terraform 的新手,对资源返回的 id 属性感到困惑。

给定:

data "azurerm_subnet" "aas_mng_subnet" {
  name                 = "${var.prefix}-${var.env_type}-subnet-${var.site_octet}.50.x"
  virtual_network_name = "${data.azurerm_virtual_network.main.name}"
  resource_group_name  = "${var.prefix}-${var.env_type}"
}

subnet_id = "${data.azurerm_subnet.aas_mng_subnet.id}"

subnet_id 的值是多少? 我的意思是一般 - 不特定于这个例子。 .id 属性在它出现的每个地方的值是多少?

Terraform documentation 试图解释这一点,但我不确定我是否仍然理解它:

数据源的属性

语法是 data.TYPE.NAME.ATTRIBUTE。 例如。 ${data.aws_ami.ubuntu.id} 将插入 id 来自名为 ubuntuaws_ami 数据源的属性。如果数据 source 有一个 count 属性集,您可以访问各个属性 具有从零开始的索引,例如 ${data.aws_subnet.example.0.cidr_block}。您也可以使用 splat 获取所有属性列表的语法: ${data.aws_subnet.example.*.cidr_block}.

如果有人能用其他词语和\或例子向我解释,我将不胜感激。

【问题讨论】:

    标签: terraform


    【解决方案1】:

    这是 Azure 返回的子网 ID,因此应该类似于 /subscriptions/subid/resourceGroups/subnet-test/providers/Microsoft.Network/virtualNetworks/vnetname/subnets/subnet1

    其他资源和其他提供者将为 ID 返回其他内容,但一般原则是资源的 ID 对提供者来说是唯一的(因此帐户和其他任何可能区分它的内容,例如区域)。

    我不太了解 Azure 提供程序,但例如 aws_instance resource 将返回一个 ID,它是类似于 i-abcdef1234567890 的实例 ID,而创建应用程序/网络负载均衡器的 aws_lb resource 有一个ID 是 ARN (Amazon Resource Name),类似于 arn:aws:elasticloadbalancing:$REGION_NAME:$ACCOUNT_NUMBER:loadbalancer/app/my-example-alb/abcdef1234567890

    【讨论】:

    • 那么它像对象引用\地址\哈希码吗?对象的一些 ID。
    • 是的,就是这样。 Terraform 可以在内部引用但不一定必须在配置中直接知道/使用的东西。因此,如果您创建一个资源 A 并且另一个资源 B 需要知道资源 A 的唯一标识符,以便它可以以某种方式使用它(例如将 VM 放置在适当的子网中),那么您可以通过插入 id 属性来传递它从资源(或数据源,如果您正在查找它而不是在此 Terraform 操作中创建它)。
    • Terraform 今天将名称 id 视为出于某些历史原因有点特殊,但从用户的角度(而不是提供者开发人员的角度)来看,它就像任何其他属性:它意味着无论提供者决定它的意思。按照惯例,提供者将在其中保存记录在远程系统中的对象的主要标识符。没有适用于所有资源类型的通用定义,因为它是特定于资源类型的事物。
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多