1.7.11.1. import
terraform import
命令用来将已经存在的资源对象导入 Terraform。
我们并不总是那么幸运,能够在项目一开始就使用 Terraform 来构建和管理我们的基础设施;有时我们有一组已经运行着的基础设施资源,然后我们为它们编写了相应的 Terraform 代码,我们进行了测试,确认了这组代码描述的基础设施与当前正在使用的基础设施是等价的;但是我们仍然无法直接使用这套代码来管理现有的基础设施,因为我们缺乏了相应的状态文件。这时我们需要使用 terraform import
将资源对象“导入”到 Terraform 状态文件中去。
1.7.11.1.1. 用法
terraform import [options] ADDRESS ID
terraform import
会根据资源 ID 找到相应资源,并将其信息导入到状态文件中 ADDRESS
对应的资源上。ADDRESS
必须符合我们在资源地址中描述的合法资源地址格式,这样 terraform import
不但可以把资源导入到根模块中,也可以导入到子模块中。
ID 取决于被导入的资源对象的类型。举例来说,AWS 主机的 ID 格式类似于 i-abcd1234
,而 AWS Route53 Zone 的 ID 类似于 Z12ABC4UGMOZ2N
,请参考相关 Provider 文档来获取有关 ID 的详细信息。如果不确信的话,可以随便尝试任意 ID。如果 ID 不合法,你会看到一个错误信息。
警告,Terraform设想的是每一个资源对象都仅对应一个独一无二的实际基础设施对象,通常来说如果我们完全使用 Terraform 创建并管理基础设施时这一点不是问题;但如果你是通过导入的方式把基础设施对象导入到 Terraform 里,要绝对避免将同一个对象导入到两个以及更多不同的地址上,这会导致 Terraform 产生不可预测的行为。
该命令有以下参数可以使用:
-config=path
:包含含有导入目标的Terraform代码的文件夹路径。默认为当前工作目录。如果当前目录不包含 Terraform 代码文件,则必须通过手动输入或环境变量来配置 Provider。-input=true
:是否允许提示输入 Provider 配置信息-lock=false
:如果 Backend 支持,是否锁定状态文件。在其他人可能会同时修改同一工作区的配置时关闭锁是危险的。-lock-timeout=0s
:重试尝试获取状态锁的间隔-no-color
:如果设定该参数,则不会输出彩色信息-parallelism=n
:限制 Terraform 遍历图的最大并行度,默认值为 10(又是考点)-var 'foo=bar'
:通过命令行设置输入变量值,类似plan
命令中的介绍-var-file=foo
:类似plan
命令中的介绍
当代码只使用了 local
类型的 Backend 时,terraform import
同时接受以下遗留参数:
-state=FILENAME
:要读取的状态文件的地址-state-out=FILENAME
:指定修改后的状态文件的保存路径,如果我们设置了-state
而没同时设置-state-out
,则 Terraform-state
的值写给-state-out
,这意味着 Terraform 如果创建新的状态快照,将直接写入源状态文件。-backup=FILENAME
:生成状态备份文件的地址,默认情况下是-state-out
路径加上.backup
后缀名。设置为-
可以关闭备份(不推荐)
1.7.11.1.2. Provider配置
Terraform 会尝试读取要导入的资源对应的 Provider 的配置信息。如果找不到相关 Provider 的配置,那么 Terraform 会提示你输入相关的访问凭据。你也可以通过环境变量来配置访问凭据。
Terraform 在读取 Provider 配置时唯一的限制是不能依赖于"非输入变量"的输入。举例来说,Provider 配置不能依赖于数据源的输出。
举一个例子,如果你想要导入 AWS 资源而你有这样的一份代码文件,那么 Terraform 会使用这两个输入变量来配置 AWS Provider:
variable "access_key" {}
variable "secret_key" {}
provider "aws" {
access_key = var.access_key
secret_key = var.secret_key
}
1.7.11.1.3. 例子
$ terraform import aws_instance.foo i-abcd1234
$ terraform import module.foo.aws_instance.bar i-abcd1234
$ terraform import 'aws_instance.baz[0]' i-abcd1234
$ terraform import 'aws_instance.baz["example"]' i-abcd1234
上面这条命令如果是在PowerShell下:
$ terraform import 'aws_instance.baz[\"example\"]' i-abcd1234
如果是cmd:
$ terraform import aws_instance.baz[\"example\"] i-abcd1234