当使用terraform plan --refresh-only
检测漂移资源时,该命令返回一个计划,其中1个或多个资源在外部更改。所有这些都用空映射{}
标记tags
属性
# aws_iam_role.lalala_poweruser has changed
~ resource "aws_iam_role" "lalala_poweruser" {
id = "lalala_poweruser"
name = "lalala_poweruser"
+ tags = {}
# (11 unchanged attributes hidden)
}
为了强调,+ tags = {}
不应该用+
符号标记,因为在部署的基础设施中没有人更改此属性。
到目前为止我尝试过的:
- 向每个资源添加带有空映射
{}
的属性 - 向每个资源添加带有实际标记的属性
- 将
defaults_tags
添加到提供程序配置
使用此命令检测漂移的最终目的是在部署新的更改之前以编程方式检测CICD管道中的任何更改。如果真的有漂移,我们想知道,我们想停止这种部署。此外,这个命令的一些有用之处在于,当检测到真正的漂移时,它会返回diff,这样我们就可以记录信息并采取行动。
Terraform文档中有关此过程的更多信息:
管理资源漂移
在Terraform的体系结构中,提供者的职责之一是读取已经在管理的每个远程对象的当前状态,将其与最近应用的结果进行比较,并生成一个新的对象来协调两者。
部分责任是处理Terraform中的值可能不同,但就远程系统而言,实际上是相同的情况。对于每个检测到的更改,提供商必须将其大致分为以下两类之一:
- "漂移":远程系统状态与以前的运行状态在功能上有很大不同
- "归一化":远程系统返回的一些数据的形状与以前略有不同,但其含义仍然相同。这方面的一些典型示例是:不区分大小写的字符串,其中远程API总是以小写形式返回它们,或者JSON字符串,其中无论输入如何,远程API总是以缩小形式返回它们
在这里显示的情况下,这个提供程序似乎没有做出正确的分类:tags = {}
和完全省略该参数之间没有功能差异,因此提供程序应该将其归类为规范化,并保留您没有设置它的事实,而不是将其报告为漂移。
您提到您已经尝试在配置中显式设置tags = {}
,但这并没有解决问题。不幸的是,这表明提供程序中存在第二个相反的错误:在创建/更新步骤中,它似乎正在将空映射规范化为与null
相同,因此提供程序不同意此参数的规范化形式。如果这是真的,那么我不认为你可以在Terraform模块中做任何事情来避免这个问题;唯一的办法是修复提供者代码库中的错误。
AWS提供商团队正在跟踪各种此类错误。这个问题表明,提供商版本v3.70.0修复了许多这样的错误,因此我建议首先确保您至少运行该版本。然而,有一条评论描述了aws_iam_policy
的类似问题,这两种资源类型密切相关,因此在这方面可能共享相同的错误。如果你已经在运行最新版本的提供商,那么我认为最好的做法是通过在同一个GitHub问题上添加另一条评论来报告这一点,这样提供商团队就会意识到这一点。
很抱歉,我没有一个只能在Terraform模块中实现的答案。