Terraform apply中断后无法执行destroy或apply的问题求助
这种情况我在日常用Terraform的时候碰到过好几次,核心问题就是Terraform的状态文件和实际云环境的资源对不上了——中断的apply进程创建了部分资源,但这些资源没被写入到状态文件里,所以才会出现apply说资源已存在、destroy说没资源可删的矛盾提示。下面给你几个实用的解决步骤:
第一步:先备份状态文件(重中之重!)
不管做什么操作,先把当前的状态文件备份一份,避免操作失误导致更糟的情况:cp terraform.tfstate terraform.tfstate.backup第二步:确认状态与实际资源的差异
先看看Terraform当前状态里记录了哪些资源:terraform state list然后去你的云服务商控制台(比如AWS Console、Azure Portal等),找到那些"异常存在"的实例,记下它们的唯一标识(比如EC2的实例ID、S3的桶名、阿里云ECS的实例ID等)。对比后就能明确哪些实际存在的资源没被Terraform状态记录。
第三步:将未记录的资源导入状态文件
用terraform import命令把这些实际存在的资源导入到Terraform状态中,这样Terraform就"知道"它们存在了。命令格式是:terraform import <资源类型>.<资源配置名称> <实际资源唯一ID>举个实际例子:如果你的配置里定义了一个AWS EC2实例
aws_instance.web_server,实际控制台里的实例ID是i-0a1b2c3d4e5f6g7h8,那导入命令就是:terraform import aws_instance.web_server i-0a1b2c3d4e5f6g7h8导入完成后,再执行
terraform state list就能看到这个资源了,这时候你可以正常执行terraform destroy清理所有资源,或者terraform apply补全剩余需要创建的资源(如果业务需要的话)。备选方案:手动清理实际资源
如果你不想导入状态,也可以直接去云控制台手动删除那些残留的异常实例。删除完成后,再执行terraform apply,这时候Terraform会重新创建所需资源,不会再提示"资源已存在"的错误。不过这个方法要注意:一定要确认所有残留资源都被彻底删除,比如关联的磁盘、弹性IP等,不然可能还是会有冲突。特殊情况:状态文件损坏
万一状态文件本身损坏了,除了用之前的备份恢复,还可以尝试执行terraform refresh(Terraform 0.15及以后版本,这个命令会自动同步状态与实际资源,现在更推荐用terraform plan来查看同步后的状态变化),它会更新状态文件以匹配实际云资源的真实状态。
内容的提问来源于stack exchange,提问作者bock.steve

