amazon-web-services - Terraform 销毁失败 - 状态文件未更新
问题描述
我使用 Terraform 部署了 AWS 基础设施,状态文件保存在 S3 中。现在我想破坏这个基础设施,因此运行一个构建,terraform plan
然后运行terraform destroy
这破坏了大部分资源,但在破坏一个 s3 存储桶时卡住了,所以我手动终止了这一步。我注意到 s3 中的状态文件没有改变。现在,当我重新运行terraform plan
后面的构建时terraform destroy
,计划步骤失败,因为实际的基础设施与状态文件中的不匹配。
我想知道如何纠正这个问题。
有没有办法可以手动更新状态文件以反映当前的基础设施?
解决方案
作为上述@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).
在触及任何重要/生产基础设施之前,我会格外小心并在测试帐户/环境中尝试此操作。