Terraform导入AWS子网后仍触发强制销毁重建问题咨询
问题根本原因
从terraform plan输出可以直接定位问题:
- 你当前已导入到状态文件中的子网资源索引是数值类型(无索引、
[1]) - 而你的代码用
for_each遍历生成的资源索引是字符串类型(["0"]、["1"])
Terraform将这两组索引识别为完全不同的资源,因此判定要删除旧索引的资源、创建新索引的资源。
注:如果你的资源实际配置名称为instance_subnets,请把后续命令里的subnets替换为instance_subnets即可
解决步骤
第一步:清理错误导入的状态记录
先把之前导入错误的资源从状态文件里移除,避免残留影响:
# 移除无索引的错误子网记录 terraform state rm module.mymodule.aws_subnet.subnets # 移除数值索引的错误子网记录 terraform state rm module.mymodule.aws_subnet.subnets[1]
如果执行报错说对应资源不存在,跳过对应命令即可。
第二步:按正确的for_each索引重新导入
注意要和代码生成的字符串索引对应,替换下面命令中的子网ID为你实际的子网ID:
# 导入索引为"0"的公网子网,替换subnet-xxxx为你Public子网的实际ID terraform import 'module.mymodule.aws_subnet.subnets["0"]' subnet-0000xxxxx # 导入索引为"1"的私网子网,替换subnet-xxxx为你Private子网的实际ID terraform import 'module.mymodule.aws_subnet.subnets["1"]' subnet-0000xxxxx
注意:索引两侧的引号和外层的单引号不能省略,避免shell解析报错
第三步:验证配置匹配
重新执行plan确认无销毁重建操作:
terraform plan
如果输出显示No changes. Your infrastructure matches the configuration.就说明配置完全匹配,不会触发资源变更。
可选优化(避免后续索引漂移)
你当前的for_each用数字索引作为键,如果后续var.subnets的顺序变化会导致资源重建,建议直接用子网名称作为for_each的键,修改资源配置如下:
resource "aws_subnet" "instance_subnets" { for_each = var.subnets cidr_block = each.value vpc_id = aws_vpc.vpc.id availability_zone = element(data.aws_availability_zones.available.names, index(keys(var.subnets), each.key)) tags = { Name = each.key } }
修改后导入命令可以用名称作为索引,可读性更强:
terraform import 'module.mymodule.aws_subnet.subnets["Public"]' subnet-0000xxxxx terraform import 'module.mymodule.aws_subnet.subnets["Private"]' subnet-0000xxxxx
内容的提问来源于stack exchange,提问作者CEamonn
相关产品推荐
相关产品推荐

