资源块
资源 是 OpenTofu 语言中最重要的元素。每个资源块描述一个或多个基础设施对象,例如虚拟网络、计算实例或更高层的组件(如 DNS 记录)。
资源语法
资源声明可以包含许多高级功能,但仅需一小部分即可开始使用。更多高级语法功能(例如产生多个类似远程对象的单个资源声明)将在本页面的后面部分进行说明。
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
一个 resource
块声明一个给定类型(“aws_instance”)的资源,并具有给定的本地名称(“web”)。该名称用于在同一模块中的其他地方引用此资源,但在该模块的范围之外没有意义。
资源类型和名称一起作为给定资源的标识符,因此在模块内必须是唯一的。
在块体({
和 }
之间)内是资源本身的配置参数。本节中的大多数参数取决于资源类型,实际上在本例中,ami
和 instance_type
都是专门为 aws_instance
资源类型 定义的参数。
资源名称必须以字母或下划线开头,并且只能包含字母、数字、下划线和连字符。
资源类型
每个资源都与一个资源类型相关联,它确定管理的基础设施对象的类型以及资源支持的参数和其他属性。
提供程序
每个资源类型都由一个 提供程序 实现,它是一个 OpenTofu 插件,提供了一组资源类型。提供程序通常为管理单个云或本地基础设施平台提供资源。提供程序与 OpenTofu 本身分开发布,但 OpenTofu 可以在初始化工作目录时自动安装大多数提供程序。
为了管理资源,模块必须指定它需要哪些提供程序。此外,大多数提供程序需要一些配置才能访问它们的远程 API,并且根模块必须提供该配置。
有关更多信息,请参阅
OpenTofu 通常会根据资源类型的名称自动确定要使用的提供程序。(按照惯例,资源类型名称以其提供程序的首选本地名称开头。)当使用提供程序的多个配置(或非首选本地提供程序名称)时,您必须使用 provider
元参数手动选择备用提供程序配置。有关更多详细信息,请参阅 provider
元参数。
资源参数
resource
块主体内的参数大多数特定于所选的资源类型。资源类型的文档列出了哪些参数可用以及它们的值应如何格式化。
资源参数的值可以充分利用 表达式 和其他动态 OpenTofu 语言功能。
还有一些由 OpenTofu 本身定义的元参数,这些参数适用于所有资源类型。(请参阅下面的 元参数。)
资源类型的文档
每个提供程序都有自己的文档,描述了它的资源类型及其参数。
大多数公开可用的提供程序都发布在 公共 OpenTofu 注册表 上,该注册表也托管了它们的文档。在 OpenTofu 注册表上查看提供程序的页面时,您可以单击标题中的“文档”链接来浏览其文档。注册表上的提供程序文档是版本化的,您可以使用标题中的下拉版本菜单来切换要查看的版本文档。
要浏览公开可用的提供程序及其文档,请参阅 公共 OpenTofu 注册表。
提供程序文档以前作为 OpenTofu 核心文档的一部分存在。尽管某些提供程序文档可能仍然托管在此处,但公共 OpenTofu 注册表现在是所有公共提供程序文档的主要存放地。
资源行为
有关 OpenTofu 在应用配置时如何管理资源的更多信息,请参阅 资源行为。
删除资源
如果您从配置中删除了资源块,OpenTofu 将将其作为默认行为进行销毁。
但是,在某些情况下,您可能希望从配置中删除资源,而不会销毁相应的基础设施对象。在这种情况下,您可以从 OpenTofu 状态 中删除它,同时允许它在远程系统中持久化。
要实现此目的,请执行以下步骤
- 从配置中删除资源。
- 添加一个已删除块,在
from
属性中指定要“遗忘”的资源地址。
例如
removed {
from = aws_instance.web
}
from
属性中的地址不能包含实例键(例如,“aws_instance.web[0]”)。
执行 tofu plan
后,OpenTofu 会指出该资源将从状态中删除,但不会被销毁。
removed
块可用于删除特定资源或包含多个资源的模块。例如
removed {
from = module.some_module
}
元参数
OpenTofu 语言定义了几个元参数,这些参数可与任何资源类型一起使用以更改资源的行为。
以下元参数在单独的页面上进行了记录
depends_on
,用于指定隐藏的依赖项count
,用于根据计数创建多个资源实例for_each
,用于根据映射或字符串集创建多个实例provider
,用于选择非默认提供程序配置lifecycle
,用于生命周期自定义provisioner
,用于在资源创建后执行额外操作
自定义条件检查
可以使用 precondition
和 postcondition
块来指定有关资源运行方式的假设和保证。以下示例创建一个前提条件,用于检查 AMI 是否已正确配置。
resource "aws_instance" "example" {
instance_type = "t2.micro"
ami = "ami-abc123"
lifecycle {
# The AMI ID must refer to an AMI that contains an operating system
# for the `x86_64` architecture.
precondition {
condition = data.aws_ami.example.architecture == "x86_64"
error_message = "The selected AMI must be for the x86_64 architecture."
}
}
}
自定义条件可以帮助捕获假设,帮助未来的维护者了解配置设计和意图。它们还会在更早的时间和上下文中返回有关错误的有用信息,帮助使用者更轻松地诊断配置中的问题。
有关更多详细信息,请参阅 自定义条件检查。
操作超时
某些资源类型提供了一个特殊的 timeouts
嵌套块参数,允许您自定义在某些操作被认为失败之前允许持续的时间。例如,aws_db_instance
允许对 create
、update
和 delete
操作进行可配置的超时。
超时完全由提供程序中的资源类型实现处理,但提供这些功能的资源类型遵循定义名为 timeouts
的子块的约定,该子块具有以每个操作命名的嵌套参数,这些操作具有可配置的超时值。这些参数中的每一个都采用持续时间的字符串表示形式,例如 "60m"
表示 60 分钟,"10s"
表示 10 秒,或 "2h"
表示 2 小时。
resource "aws_db_instance" "example" {
# ...
timeouts {
create = "60m"
delete = "2h"
}
}
可配置的操作集由每个资源类型选择。大多数资源类型根本不支持 timeouts
块。请查阅每个资源类型的文档以查看它是否提供任何可配置的操作。