我们有一个由 Terraform 部署和管理的 AWS DocumentDB 集群。在测试时,我们手动将控制台中的 2 个参数组设置更改为禁用(tls 和 ttl_monitor)。我们已经手动启用了它们,但每次我们运行 terraform plan 时,它都想将这两个参数设置为“null”。我们没有任何特定的 Terraform 参数组设置,默认设置是启用它们,因此当 Terraform 将其设置为 null 时,它不会对实际值产生任何影响,但每次我们应用时,terraform 都会成功“应用” ' 这些变化,但随后的地形计划不断表明它希望做出相同的改变。
我尝试将这些特定设置添加到 Terraform 中作为“启用”,这解决了问题,但我们有另一个环境(产品),我们没有进行这些手动更改,如果我们使用 Terraform 设置集群参数,我们会得到产品上有类似的问题,尽管将它们设置为启用,但 Terraform 每次都想更改 ttl_monitor 设置。我认为正确设置的唯一方法是重新创建集群,而不是进行任何进一步的手动更改,但想了解为什么 Terraform 每次都需要设置为 null。
我希望 dev 的行为像 prod - 我们没有用于集群参数组设置的特定 terraform 条目,因此所有内容都设置为默认值,并且 terraform 不希望每次都将任何参数组设置设置为 null 。这就是 prod 的工作方式,也是我们在控制台中手动更改参数设置之前 dev 的工作方式。如果唯一的方法是重新创建它,那就这样吧,但这似乎有点像大锤方法,特别是如果 terraform 在应用时将其设置为 null 的话。
此计划输出的原因在于 terraform 工作原理的本质。
简而言之,当 terraform 创建计划时,它会从 AWS 读取当前配置,并获取 terraform 代码中未明确设置的默认配置。
然后,Terraform 将此读取的配置与 terraform 状态和代码进行比较,后者根本不包含 AWS(或 AWS 的 terraform 提供程序)的默认配置。因此,计划显示了差异(例如 null != false)。
可能的解决方案:.
处理多个环境的不同配置的一种方法是添加变量和特定于环境的变量文件。这样,您可以为两个环境显式设置具有不同值的这些变量。
作为示例,请参阅此处的建议:https://www.terraform-best-practices.com/examples/terraform/medium-size-infrastruct
请记住通过使用模块创建可重用的 Terraform 代码。我强烈推荐 HashiCorp 制作的有关使用 Terraform 发展基础设施的视频:https://www.youtube.com/watch?v=wgzgVm7Sqlk