在使用terraform plan --refresh-only检测漂移资源时,该命令返回一个计划,其中一个或多个资源在外部更改。它们都用空的映射( 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文档:
发布于 2022-10-12 16:50:55
在Terraform的体系结构中,提供者的职责之一是读取每个已被管理的远程对象的当前状态,将其与最近应用的结果进行比较,并生成一个新的对象来协调这两者。
这种责任的一部分是处理在Terraform中价值观可能不同但就远程系统而言实际上是相同的情况。对于每个检测到的更改,提供者必须将其大致分为以下两类中的一种:
在这里您已经看到的情况下,这个提供程序似乎没有做出正确的分类:tags = {}和完全忽略这个论点之间没有功能上的区别,所以提供程序应该将其归类为规范化,并保留您没有设置它的事实,而不是将其报告为漂移。
您提到您已经尝试在配置中显式设置tags = {},但这并没有解决问题。不幸的是,这表明了提供程序中另一个相反的错误:在创建/更新步骤中,它似乎正在将一个空映射规范化为与null相同,因此提供程序不同意它自己关于该参数的规范化形式是什么的看法。如果这是真的,那么我不认为您可以在Terraform模块中做任何事情来避免这个问题;唯一的方法是修复提供者代码库中的错误。
AWS提供程序团队是跟踪这种类型的各种错误。这个问题说,提供者版本3.70.0修复了一些这些错误,所以我建议确保您至少运行该版本作为第一步。然而,存在aws_iam_policy,这两种资源类型密切相关,因此在这方面可能存在相同的bug。如果您已经在运行该提供程序的最新版本,那么我认为这里最好的方法是通过向同一个GitHub问题添加另一个注释来报告这一点,因此提供者团队将意识到这一点。
很抱歉,我没有一个只能在Terraform模块中实现的答案。
https://stackoverflow.com/questions/74043276
复制相似问题