terraform plan 未检测到漂移

Posted

技术标签:

【中文标题】terraform plan 未检测到漂移【英文标题】:terraform plan does not detect drift 【发布时间】:2021-05-24 09:40:58 【问题描述】:

我有一个非常基本的 ec2 配置,只包含

AMI 和实例类型:

provider "aws" 
  region="ap-south-1"


resource "aws_instance" "tec3"
    ami=var.image_id
    instance_type=var.instance_type
    subnet_id=var.default_subnet

但我注意到 terraform plan 和 tfstate 文件的奇怪行为。

第一种情况:

当我在控制台中添加一个新标签时(在所需的配置/状态中不存在),它显示为在执行 terraform plan 时要删除的更改。

第二个场景:

当我从控制台将信用规范更改为无限制时(在所需的配置/状态中也不存在)。建筑在 terraform 计划中显示为最新的。

你能告诉我,为什么会这样吗?

据我了解,所需配置中不存在的属性不会受到控制台中所做更改的影响。

因此,在这两种情况下,基础设施都应该是最新的。

请解释这种情况以及任何其他情况,以备将来使用。从控制台更改时。

【问题讨论】:

我明白你的意思。可能是错误。类似的问题已报告为错误并已解决。一个例子here. 【参考方案1】:

检测漂移的能力取决于每个单独的供应商的各种设计细节,而且供应商团队通常在其他限制范围内工作,或者有其他优先于漂移检测的优先级。出于这个原因,Terraform 提供程序漂移检测是一个尽力而为的功能,而不是你应该构建你的流程来依赖的东西。

虽然我不熟悉您在此处描述的特定提供程序功能,但在某些情况下可能会实施提供程序以忽略漂移的一个原因是,如果未设置参数的值是由服务器动态选择的,而不是在您的配置或提供程序本身中明确设置。在这种情况下,提供者对该值的唯一记录是远程系统中的值,因此没有什么可以与该值进行比较以检测漂移。

您可以通过为配置中的每个参数显式设置一个值,而不是让远程系统选择默认值,从而为提供者提供更好的机会来检测漂移:

resource "aws_instance" "tec3"
  ami           = var.image_id
  instance_type = var.instance_type
  subnet_id     = var.default_subnet

  credit_specification 
    cpu_credits = "unlimited"
  

虽然最终还是由提供者实现来决定哪些算作漂移,哪些不算,但在配置中编写一个显式参数至少会给提供者一个期望值来比较远程系统,从而允许它潜在地检测并计划更正对该特定参数的不需要的更改。


更新:在 AWS 提供商存储库的 issue #17856 中,AWS 提供商团队的一名成员独立证实了我的假设,即这是团队有意的设计决策,但包括一些不同的和更多的详细说明为什么会这样,对于这种特殊情况,以及 AWS 提供商团队在发展现有资源类型以支持新的 AWS API 行为时所做的一些权衡。

【讨论】:

您好 Martin,我的配置中没有提到标签和信用规范。但是 terraform 能够检测标签的漂移,但不能检测信用规范。这可能是一个错误还是背后有一些逻辑。 tags 是一个仅由您在配置中选择的参数示例,并且永远不会由远程 API 自动填充,因此与 cpu_credits 不同,我希望 AWS 提供商是将您缺席的tags 视为与tags = 相同,因此可以在这种情况下检测到漂移。但就像我说的那样,每个属性的行为都不同,具体取决于提供程序的实现方式(并且可能会在版本之间发生变化),因此您永远不应将漂移检测作为主要工作流程的一部分。 知道了 martin :),就像 cpu_credit 被远程 API 自动填充到 standard 一样,无法检测到漂移。还有另一个名为disable_api_termination 的属性也自动填充为false,但是当我将其从控制台更改为true 时,terraform 能够检测到那里的漂移并将其更改回false。所以,对我来说,它看起来像一个错误:( 我在试图弄清楚为什么我的credit_specification 根本不接受时遇到了这个问题——我的配置明确表示standard,但它总是将我的t4g.medium 创建为unlimited。在这一点上,credit_specification 确实有些问题...... 如果您在 AWS 提供商对 credit_specification 的处理中发现了一个错误,那么我建议您在 the AWS provider repository 中报告它。

以上是关于terraform plan 未检测到漂移的主要内容,如果未能解决你的问题,请参考以下文章

terraform plan 通知基础设施的变化,但也说没有变化

在 Terraform 中为 azurerm_app_service_plan 创建 azurerm_sql_firewall_rule

Terraform 是什么?

terraform 显示返回 4 个 json 对象

Terraform 学习笔记

Terraform系列三腾讯云CVM中的玩法