1.6.3.1. 资源地址
在编码时我们有时会需要引用一些资源的输出属性或是一些模块的输出值,这都涉及到如何在代码中引用特定模块或是资源。另外在执行某些命令行操作时也需要我们显式指定一些目标资源,这时我们要掌握Terraform的资源路径规则。
一个资源地址是用以在一个庞大的基础设施中精确引用一个特定资源对象的字符串。一个地址由两部分组成:[module path][resource spec]。
1.6.3.1.1. 模块路径
一个模块路径在模块树上定位了一个特定模块。它的形式是这样的:module.module_name[module index]
- module:module关键字标记了这时一个子模块而非根模块。在路径中可以包含多个module关键字
- module_name:用户定义的模块名
- [module index]:(可选)访问多个子模块中特定实例的索引,由方括号包围
一个不包含具体资源的地址,例如module.foo代表了模块内所有的资源(如果只是单个模块而不是多实例模块),或者是多实例模块的所有实例。要指代特定模块实例的所有资源,需要在地址中附带下标,例如module.foo[0]。
如果地址中模块部分被省略,那么地址就指代根模块资源。
一个多module关键字应用于多实例模块的例子:module.foo[0].module.bar["a"]。
要注意的是,由于模块的count和for_each元参数是Terraform 0.13开始引进的,所以多实例模块地址也只能在0.13及之后的版本使用。
1.6.3.1.2. 资源地址形式
一个资源地址定位了代码中特定资源对象,它的形式是这样的:resource_type.resource_name[resource index]
- resource_type:资源类型
- resource_name:用户定义的资源名称
- [resource index]:(可选)访问多实例资源中特定资源实例的索引,由方括号包围
1.6.3.1.3. 多实例模块与资源的访问索引
以下规约适用于访问多实例模块及资源时使用的索引值:
- [N]:当使用count元参数时N是一个自然数。如果省略,并且count > 1,那么指代所有的实例
- ["INDEX"]:当使用for_each元参数时INDEX是一个字母数字混合的字符串
1.6.3.1.4. 例子
1.6.3.1.4.1. count的例子
给定一个代码定义:
resource "aws_instance" "web" {
# ...
count = 4
}
给定一个地址:aws_instance.web[3],它指代的是最后一个名为web的aws_instance实例;给定地址aws_instance.web,指代的是所有名为web的aws_instance实例。
1.6.3.1.4.2. for_each的例子
给定如下代码:
resource "aws_instance" "web" {
# ...
for_each = {
"terraform": "value1",
"resource": "value2",
"indexing": "value3",
"example": "value4",
}
}
地址aws_instance.web["example"]引用的是aws_instance.web中键为"example"的实例。