跳至主要内容

导入使用

使用 tofu import 命令将现有基础设施导入 OpenTofu 状态。

tofu import 命令一次只能导入一个资源。它无法同时导入一整个资源集合,例如 AWS VPC。

要导入资源,首先在配置中为其编写资源块,建立它在 OpenTofu 中的名称

代码块
resource "aws_instance" "example" {
# ...instance configuration...
}

此处的名称“example”在声明它的模块中是本地的,由配置作者选择。这不同于远程系统发行的任何 ID,后者可能会随着时间的推移而发生变化,而资源名称保持不变。

如果需要,你现在可以将资源块的主体留空,并在导入实例后返回填写它。

现在可以运行 tofu import 将现有实例附加到此资源配置

代码块
$ tofu import aws_instance.example i-abcd1234

此命令找到 ID 为 i-abcd1234 的 AWS EC2 实例。然后,它将实例的现有设置(如 EC2 API 所述)附加到模块的名称 aws_instance.example。在此示例中,模块路径意味着使用了根模块。最后,映射将保存在 OpenTofu 状态中。

还可以将资源导入到子模块中,使用它们的路径,并使用 countfor_each 设置将资源导入到单个实例中。有关如何指定目标资源的更多详细信息,请参阅 资源寻址

给定 ID 的语法取决于要导入的资源类型。例如,AWS 实例使用由 EC2 API 发行的不透明 ID,但 AWS Route53 区域使用域名本身。有关需要哪种形式的 ID 的详细信息,请查阅每个可导入资源的文档。

作为上述命令的结果,资源将记录在状态文件中。你现在可以运行 tofu plan 来查看配置与导入的资源之间的比较,并对配置进行任何调整以与导入对象的当前(或期望)状态保持一致。

复杂导入

上述导入被认为是“简单导入”:一个资源被导入到状态文件中。导入也可能导致“复杂导入”,其中导入多个资源。例如,AWS 网络 ACL 导入一个 aws_network_acl,但也为每个规则导入一个 aws_network_acl_rule

在这种情况下,辅助资源将不存在于配置中,因此有必要查阅导入输出并在配置中为每个辅助资源创建一个 resource 块。如果没有这样做,OpenTofu 将在下次运行时计划销毁导入的对象。

如果你想重命名或移动导入的资源,可以使用 状态管理命令