如何将现有资源导入到存放在独立子目录的Terraform模块中
Terraform 跨模块资源导入报错解决方案
问题根因
你出现报错的核心原因是:定义在子模块中的资源,在Terraform状态中的寻址路径和根目录直接定义的资源规则不同,你使用了根目录资源的寻址规则去导入模块内的资源,Terraform无法找到对应资源声明。
具体解决步骤
- 第一步:先确保根目录
main.tf中已经正确调用了你的子模块,示例配置如下:
# 根目录main.tf添加内容 module "foo" { source = "./modules/module_foo" # 如果子模块有声明必填变量,这里同步传入对应值即可 }
- 第二步:重新执行
terraform init初始化模块,确保Terraform能识别到子模块的配置 - 第三步:使用符合模块资源规则的寻址路径执行导入命令,模块内资源的寻址格式为
module.<根目录调用模块时的名称>.<资源类型>.<资源逻辑名>
你当前场景对应的正确导入命令为:
terraform import module.foo.aws_vpc.main vpc-xxx1234
- 第四步:导入完成后执行
terraform plan验证,正常会提示No changes. Your infrastructure matches the configuration.,如果存在配置差异,调整子模块中的资源参数和云上实际配置一致即可。
通用规则说明
如果是多层嵌套模块,资源寻址需要逐层拼接模块名称,例如嵌套在foo模块下的bar子模块中的资源,寻址格式为module.foo.module.bar.<资源类型>.<资源逻辑名>,所有导入模块内资源的场景都遵循该规则。
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

