1. 概述

Terraform 是一个基础设施即代码(IaC)工具,广泛用于云环境下的基础设施部署和管理。它使用一种简洁的声明式语言 HashiCorp Configuration Language (HCL)。Terraform 中的资源(如 资源)通常具有多个属性(attributes)或参数(arguments),我们有时需要了解这些属性的名称、类型以及是否可选等信息。

本文将介绍几种查看 Terraform 资源属性的方法。我们使用的 Terraform 版本为 1.8.2。

2. 示例配置

我们以一个简单的 Terraform 配置为例,它会将 Hello Baeldung 写入 /tmp/hello_baeldung.txt 文件:

$ cat hello_baeldung.tf
resource "local_file" "hello_baeldung" {
    content = "Hello Baeldung\n"
    filename = "/tmp/hello_baeldung.txt"
    file_permission = "0744"
}

该配置使用了 local_file 资源,用于生成指定内容的文件:

  • content:指定文件内容
  • filename:指定文件名
  • file_permission:设置文件权限

虽然我们只设置了这三个属性,但 local_file 实际上还支持更多属性,我们将在后续章节中逐步展开。

3. 使用 Provider 官方文档

Terraform 的每个 Provider 都会在 Terraform Registry 上提供详细的文档,包括资源类型及其属性说明。

local_file 为例,其文档地址为:local_file 文档

文档中包含一个 Schema 部分,展示了每个属性的描述和类型:

HashiCorp Local File

例如:

  • filename 是必填项,类型为 string
  • content 是可选项,类型也为 string

优点:最权威,适合查看详细说明和使用限制
缺点:需依赖网络,查找多个资源时效率较低

4. 使用 terraform console

terraform console 是一个交互式命令行工具,用于运行 Terraform 表达式。我们可以通过它查看资源的属性及其类型。

使用前需先初始化项目:

terraform init

然后运行:

terraform console

在控制台中使用 type() 函数查看资源属性:

> type(local_file.hello_baeldung)
object({
    content: string,
    content_base64: string,
    content_base64sha256: string,
    content_base64sha512: string,
    content_md5: string,
    content_sha1: string,
    content_sha256: string,
    content_sha512: string,
    directory_permission: string,
    file_permission: string,
    filename: string,
    id: string,
    sensitive_content: string,
    source: string,
})

⚠️ 注意:必须先运行 terraform apply,否则无法获取完整属性列表。

优点:快速查看当前资源配置的属性
缺点:需先部署资源,不能用于尚未创建的资源

5. 使用 terraform providers schema

另一个更实用的方法是使用 terraform providers schema 命令查看资源的 schema 信息:

terraform providers schema -json | jq

输出结果中会包含当前项目所依赖的 Provider 的所有资源 schema,例如:

{
  "resource_schemas": {
    "local_file": {
      "block": {
        "attributes": {
          "content": {
            "type": "string",
            "description": "Content to store in the file, expected to be a UTF-8 encoded string.\n Conflicts with `sensitive_content`, `content_base64` and `source`.\n Exactly one of these four arguments must be specified.",
            "description_kind": "plain",
            "optional": true
          },
          ...
        }
      }
    }
  }
}

我们可以使用 jq 进一步提取所需信息,例如列出所有属性及其类型:

terraform providers schema -json | jq -r '.provider_schemas["registry.terraform.io/hashicorp/local"].resource_schemas.local_file.block.attributes | keys[] as $k | "\($k), \(.[$k] | .type)"'

输出如下:

content, string
content_base64, string
content_base64sha256, string
content_base64sha512, string
content_md5, string
content_sha1, string
content_sha256, string
content_sha512, string
directory_permission, string
file_permission, string
filename, string
id, string
sensitive_content, string
source, string

⚠️ 注意:执行前需先运行 terraform init 下载 Provider,否则会报错。

优点:无需部署即可查看属性,支持脚本化提取
缺点:输出格式复杂,需配合 jq 解析

6. 总结

本文介绍了三种查看 Terraform 资源属性的方法:

方法 是否需部署 是否需网络 是否可脚本化 适用场景
Provider 官方文档 查阅详细说明
terraform console 快速查看当前资源属性
terraform providers schema + jq 自动化提取属性信息

推荐组合:使用 terraform providers schema + jq 是最灵活、最实用的方式,尤其适合写脚本自动化分析 Terraform 配置。


原始标题:How to Find the Attributes of a Terraform Resource