如何避免空"Objects have changed outside of Terraform"?

How to avoid empty "Objects have changed outside of Terraform"?

上下文:尽管这个问题与 相关,但并不完全相同。

我无法分享我的确切 TF 配置,但我的想法是我收到 一个空的“对象已在 Terraform 之外更改”警告消息?

$ terraform plan
Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply":


Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to
these changes.

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

No changes. Your infrastructure matches the configuration.

没有显示任何潜在的变化。

当我复制当前状态然后将其与 运行 terraform apply --auto-approve 之后的新状态进行比较时,也没有任何变化:

diff terraform.tfstate old.tfstate                          
4c4
<   "serial": 25,
---
>   "serial": 24,
217d216
<             "data.foo.test",
219c218,219
<             "data.bar.test2"
---
>             "data.bar.test2",
>             "data.bar.test2"

似乎唯一的区别是 TF 状态下的资源排序。是 TF 错误还是什么?

$ terraform version 
Terraform v0.15.4

还在 GitHub 上发现了相关问题:https://github.com/hashicorp/terraform/issues/28776

这种奇怪的行为可能是为了响应特定提供商处理“刷新”步骤的方式中的怪癖而发生的。为了与使用为 Terraform v0.11 及更早版本设计的旧版 SDK 编写的 Terraform 提供程序向后兼容,计划渲染器将抑制由于该 SDK 中的 limitations/flaws 而容易出现的某些差异,例如值为 null 刷新前,但刷新后 ""(空字符串)。

不幸的是,如果那种变化是 唯一的 变化,那么它可能会以这种方式混淆 Terraform,Terraform 可以看到存在差异,但是当它尝试渲染时它作为旧版 SDK 噪声被抑制的差异,因此最终报告没有差异。

此行为在 Terraform 的更高版本中得到改进,因此升级到最新的 v1.x.y 版本可能会避免该问题,假设这是 Terraform 团队已经解决的问题之一。

我认为您在这里看不到 状态 有任何变化的原因可能是因为没有针对您的配置差异做出任何更改, Terraform 跳过了“应用”步骤,因此实际上并未提交刷新状态。您可以通过创建和应用 refresh-only 计划强制 Terraform 将刷新更改视为要提交的内容:

terraform apply -refresh-only

假设此处行为不当的提供者在其行为不端方面是一致的(即:一旦它返回一个略有不同的值,如果它将保持返回该值),之后应用仅刷新计划,您将不会再看到此消息,因为同一对象的未来刷新将不会检测到任何此类无关紧要的差异。