首页 > 解决方案 > Terraform 销毁失败 - 状态文件未更新

问题描述

我使用 Terraform 部署了 AWS 基础设施,状态文件保存在 S3 中。现在我想破坏这个基础设施,因此运行一个构建,terraform plan然后运行terraform destroy

这破坏了大部分资源,但在破坏一个 s3 存储桶时卡住了,所以我手动终止了这一步。我注意到 s3 中的状态文件没有改变。现在,当我重新运行terraform plan后面的构建时terraform destroy,计划步骤失败,因为实际的基础设施与状态文件中的不匹配。

我想知道如何纠正这个问题。

有没有办法可以手动更新状态文件以反映当前的基础设施?

标签: amazon-web-servicesterraformterraform-provider-aws

解决方案


作为上述@Marcin 提出的解决方案的“包装器”,您可以terraform state rm在基于terraform state list. 下面是一个简单的例子:

列出状态文件中的资源

$ terraform state list
data.aws_ami.amazon_linux
data.aws_subnet_ids.def_vpc_public_subnets
data.aws_vpc.def_vpc
aws_instance.test1
aws_security_group.sec_ssh_ping

(将列表发送到文本文件)

$ terraform state list > state_list.txt

(编辑 state_list.txt 使其仅包含您要删除的资源)(备份状态文件)

使用 bash 循环删除文件中列出的资源

$ for s in $(cat state_list.txt) ;do  echo "removing $s"; terraform state rm $s ; done
removing data.aws_ami.amazon_linux
Removed data.aws_ami.amazon_linux
Successfully removed 1 resource instance(s).
removing data.aws_subnet_ids.def_vpc_public_subnets
Removed data.aws_subnet_ids.def_vpc_public_subnets
Successfully removed 1 resource instance(s).
removing data.aws_vpc.def_vpc
Removed data.aws_vpc.def_vpc
Successfully removed 1 resource instance(s).
removing aws_instance.test1
Removed aws_instance.test1
Successfully removed 1 resource instance(s).
removing aws_security_group.sec_ssh_ping
Removed aws_security_group.sec_ssh_ping
Successfully removed 1 resource instance(s).

在触及任何重要/生产基础设施之前,我会格外小心并在测试帐户/环境中尝试此操作。


推荐阅读