Terraform 刷新到底有什么作用?

What does terraform refresh really do?

使用 Terraform 在 AWS 中部署相当大的基础设施时,我们的远程 tfstate 损坏并被删除。

从文档中,我了解到 terraform refresh 应该查询 AWS 以获取基础设施的真实状态并相应地更新 tfstate,但这并没有发生:我的 tfstate 未受影响并且 plan + apply 给出了一个很多 Already existing 个错误。

terraform refresh 的真正作用是什么?

terraform refresh 尝试查找状态文件中保存的任何资源,并使用自上次 运行.

以来在 Terraform 之外的提供程序中发生的任何漂移进行更新

例如,假设您的状态文件包含 3 个实例 ID 为 i-abc123i-abc124i-abc125 的 EC2 实例,然后您在 Terraform 外部删除 i-abc124 .在 运行ning terraform refresh 之后,plan 将显示它需要创建第二个实例,而销毁计划将显示它只需要销毁第一个和第三个实例(并且不会失败销毁失踪的第二个实例)。

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

为了让自己摆脱当前的困境,我建议您自由地使用 terraform import 将内容恢复到您的状态文件中,或者,如果可能,手动销毁 Terraform 之外的所有内容并从头开始。

将来我会建议拆分状态文件以申请更多 g运行ular 上下文,并将您的远程状态存储在启用版本控制的 S3 存储桶中。您还可以使用 Terragrunt 之类的工具来锁定您的状态文件,以帮助避免损坏或等待即将发布的 Terraform 0.9 版本中的本机状态文件锁定。

我知道这有点晚了,但在我最近与 terraform 打交道时,我读到它仍然保留本地状态文件 tfstate.backup 以防远程状态文件损坏。显然,我还没有尝试过这个,然后你可以做 terraform state push 它会将备份推送到远程。

干杯

计划-> 在上述情况下,当第二个 EC2 实例被删除时,当您使用 terraform plan 再次尝试时,它确实刷新了 terraform 状态,但 in-memory 在计划之前。 刷新状态将用于计算此计划,但不会 保存在本地或远程状态存储中。

刷新-> 但是,如果我 运行 单独 terraform refresh 那么它实际上会刷新本地或远程状态存储中存在的状态文件。

希望你现在能得到答案...

@Philip 看来我是最后一个了,继续你的回答。

在你来到这里之前,你已经知道 Terraform 刷新将更新任何现实世界漂移的本地状态,并与你的 Terraform 模板中的实际基础设施进行比较。

然后 Terraform 将删除不属于您所需配置的内容。

例如: 1.) 具有 1 条规则的所需 SG,有人手动将另一条规则添加到 SG。 2) 您 运行 Terraform Refresh 或 Plan,然后 Terraform 在您的远程或本地状态下记录下来并相应地生成计划。 3.) 然后在你接下来应用它将删除手动添加的更改。

但如果您想保留这些手动更改,则需要使用 ignore_changes 向您的资源添加一个生命周期块。

例如:

resource "aws_security_group" "default" {
   lifecycle {
     ignore_changes = [ingress]
   }

}