terraform刷新实际上做了什么?

问题描述:

在使用terraform在AWS中部署相当大的基础架构时,我们的远程tfstate已损坏并被删除。terraform刷新实际上做了什么?

从文档,我推测,terraform refresh应查询AWS获得基础设施的实际状况和accordigly更新tfstate,但这并没有发生:我tfstate是原封不动,计划+应用给很多Already existing错误。

terraform refresh确实是做什么的?

terraform refresh尝试查找状态文件中保存的任何资源,并更新自上次运行以来发生在Terraform外部的提供程序中的任何漂移。

例如,假设您的状态文件包含3个EC2实例,其实例ID为i-abc123,i-abc124,i-abc125,然后删除Terraform以外的i-abc124。运行terraform refresh后,​​将显示它需要创建第二个实例,而销毁计划会显示它只需要销毁第一个和第三个实例(并且不会破坏丢失的第二个实例)。

Terraform做出了一个非常具体的决定,不会干扰Terraform不管理的事情。这意味着如果资源不存在于其状态文件中,那么它绝对不会以任何方式触及它。这使您可以运行Terraform以及其他工具,并在AWS控制台中进行手动更改。这也意味着您可以在不同的环境下运行Terraform,只需提供一个不同的状态文件即可使用,从而使您可以将基础架构拆分为多个状态文件,并避免灾难性的状态文件损坏。

为了摆脱目前的困境,我建议您使用terraform import*地将事情重新放回状态文件中,或者如果可能的话,手动销毁Terraform以外的所有内容并从头开始。

将来我会建议将状态文件拆分为适用更多粒度的上下文,并将远程状态存储在启用了版本控制的S3存储桶中。您也可以使用像Terragrunt这样的工具来锁定状态文件,以帮助避免损坏或等待即将到来的0.9版Terraform中的本地状态文件锁定。

+0

感谢您的清晰和详细的答案。事实上,我们在S3存储桶中拥有我们的tfstate,但不提供版本控制。正如你所建议的,我们用手摧毁了所有的东西,几天前又启用了s3版本并再次运行'terraform apply'。我问了这个问题,以更好地理解相当危急情况的根本原因。 – Bruno9779