跳至主要内容

资源寻址

一个资源地址是一个字符串,它标识您整体配置中的零个或多个资源实例。

一个地址由两部分组成

代码块
[module path][resource spec]

在某些情况下,OpenTofu 可能允许使用不完整的资源地址,该地址仅引用整个模块,或省略多实例资源的索引。在这些情况下,含义取决于上下文,因此您需要参考您正在使用的特定功能的文档,该功能解析资源地址。

模块路径

模块路径引用模块树中的一个模块。它采用以下形式

代码块
module.module_name[module index]
  • module - 表示子模块(非根)的模块关键字。路径中的多个module关键字表示嵌套。
  • module_name - 用户定义的模块名称。
  • [module index] - (可选)索引 用于从具有多个实例的模块调用中选择一个实例,用方括号([])包围。

没有资源规范的地址,即module.foo,如果是一个单独的模块,则应用于模块中的每个资源,如果模块具有多个实例,则应用于模块的所有实例。要寻址特定模块实例的所有资源,请在地址中包含模块索引,例如module.foo[0]

如果省略模块路径,则该地址将应用于根模块。

module关键字区分两个具有多个实例的模块的示例

代码块
module.foo[0].module.bar["a"]

资源规范

资源规范引用所选模块中的特定资源实例。它具有以下语法

代码块
resource_type.resource_name[instance index]
  • resource_type - 正在寻址的资源的类型。
  • resource_name - 用户定义的资源名称。
  • [instance index] - (可选)索引 用于从具有多个实例的资源中选择一个实例,用方括号([])包围。

没有模块路径前缀的资源规范仅匹配根模块中的资源。

模块和资源的索引值

以下规范适用于具有多个实例的模块和资源上的索引值

  • [N],其中N 是一个0为基的数字索引,指向由count元参数指定的多实例资源。在寻址count > 1 的资源时,省略索引意味着该地址引用所有实例。
  • ["INDEX"],其中INDEX 是由for_each元参数指定的多实例资源中的字母数字键索引。

示例

count 示例

假设 OpenTofu 配置包括

代码块
resource "aws_instance" "web" {
# ...
count = 4
}

像这样的地址

代码块
aws_instance.web[3]

仅引用配置中的最后一个实例,像这样的地址

代码块
aws_instance.web

引用所有四个“web”实例。

for_each 示例

假设 OpenTofu 配置包括

代码块
resource "aws_instance" "web" {
# ...
for_each = {
"tofu": "value1",
"resource": "value2",
"indexing": "value3",
"example": "value4",
}
}

像这样的地址

代码块
aws_instance.web["example"]

仅引用配置中的“example”实例,并解析为“value4”。