Terraform资源地址

在编码时有时会需要引用一些资源的输出属性或是一些模块的输出值,这都涉及到如何在代码中引用特定模块或是资源。另外在执行某些命令行操作时也需要显式指定一些目标资源,这时要掌握Terraform的资源路径规则。

一个资源地址是用以在一个庞大的基础设施中精确引用一个特定资源对象的字符串,一个地址由两部分组成:[module path][resource spec]

模块路径

一个模块路径在模块树上定位了一个特定模块,它的形式是这样的:module.module_name[module index]

  • module:module关键字标记了这时一个子模块而非根模块,在路径中可以包含多个module关键字
  • module_name:用户定义的模块名
  • [module index]:访问多个子模块中特定实例的索引,由方括号包围(可选)

一个不包含具体资源的地址,例如module.foo代表了模块内所有的资源(如果只是单个模块而不是多实例模块),或者是多实例模块的所有实例。要指代特定模块实例的所有资源,需要在地址中附带下标,例如module.foo[0]

如果地址中模块部分被省略,那么地址就指代根模块资源。

一个多module关键字应用于多实例模块的例子:module.foo[0].module.bar["a"]

注意 ,由于模块的countfor_each元参数是Terraform 0.13开始引进的,所以多实例模块地址也只能在0.13及之后的版本使用。

资源地址形式

一个资源地址定位了代码中特定资源对象,它的形式是这样的:resource_type.resource_name[resource index]

  • resource_type:资源类型
  • resource_name:用户定义的资源名称
  • [resource index]:访问多实例资源中特定资源实例的索引,由方括号包围(可选)

多实例模块与资源的访问索引

以下规约适用于访问多实例模块及资源时使用的索引值:

  • [N]:当使用count元参数时N是一个自然数,如果省略,并且count > 1,那么指代所有的实例
  • ["INDEX"]:当使用for_each元参数时INDEX是一个字母数字混合的字符串

资源地址示例

count的例子

给定一个代码定义:

复制代码
resource "aws_instance" "web" {
  count = 4
}

给定一个地址:aws_instance.web[3],它指代的是最后一个名为web的aws_instance实例;给定地址aws_instance.web,指代的是所有名为web的aws_instance实例。

for_each的例子

给定如下代码:

复制代码
resource "aws_instance" "web" {
  for_each = {
    "terraform": "value1",
    "resource":  "value2",
    "indexing":  "value3",
    "example":   "value4",
  }
}

地址aws_instance.web["example"]引用的是aws_instance.web中键为"example"的实例。

相关推荐
筱歌儿几秒前
css 左右布局
前端·css
GISer_Jing25 分钟前
编译原理AST&以Babel为例进行解读、Webpack中自定义loader与plugin
前端·webpack·node.js
GISer_Jing26 分钟前
Webpack中Compiler详解以及自定义loader和plugin详解
前端·webpack·node.js
呆呆洁ᵔ·͈༝·͈ᵔ31 分钟前
配置集群-日志聚集操作
java·ide·eclipse
浩~~37 分钟前
CSS常用选择器
前端·css
lyrhhhhhhhh41 分钟前
Spring 模拟转账开发实战
java·后端·spring
于慨43 分钟前
uniapp+vite+cli模板引入tailwindcss
前端·uni-app
banzhenfei44 分钟前
xp_cmdshell bcp 导出文件
java·数据库·sql
带刺的坐椅1 小时前
SpringBoot3 使用 SolonMCP 开发 MCP
java·ai·springboot·solon·mcp
yunvwugua__1 小时前
Python训练营打卡 Day26
前端·javascript·python