首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform计划--只在已部署的资源中返回带空标记的假漂移

Terraform计划--只在已部署的资源中返回带空标记的假漂移
EN

Stack Overflow用户
提问于 2022-10-12 14:07:00
回答 1查看 81关注 0票数 1

在使用terraform plan --refresh-only检测漂移资源时,该命令返回一个计划,其中一个或多个资源在外部更改。它们都用空的映射( tags )标记{}属性。

代码语言:javascript
复制
  # 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文档:

管理资源漂移

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-12 16:50:55

在Terraform的体系结构中,提供者的职责之一是读取每个已被管理的远程对象的当前状态,将其与最近应用的结果进行比较,并生成一个新的对象来协调这两者。

这种责任的一部分是处理在Terraform中价值观可能不同但就远程系统而言实际上是相同的情况。对于每个检测到的更改,提供者必须将其大致分为以下两类中的一种:

  • “漂移”:远程系统状态在功能上与以前的运行状态不同。
  • “规范化”:远程系统返回的一些数据的形状与以前略有不同,但它仍然意味着相同的事情。这方面的一些典型示例是:不区分大小写的字符串,其中远程API总是以小写形式返回它们,或者JSON字符串,其中远程API总是返回它们,而不管输入如何。

在这里您已经看到的情况下,这个提供程序似乎没有做出正确的分类:tags = {}和完全忽略这个论点之间没有功能上的区别,所以提供程序应该将其归类为规范化,并保留您没有设置它的事实,而不是将其报告为漂移。

您提到您已经尝试在配置中显式设置tags = {},但这并没有解决问题。不幸的是,这表明了提供程序中另一个相反的错误:在创建/更新步骤中,它似乎正在将一个空映射规范化为与null相同,因此提供程序不同意它自己关于该参数的规范化形式是什么的看法。如果这是真的,那么我不认为您可以在Terraform模块中做任何事情来避免这个问题;唯一的方法是修复提供者代码库中的错误。

AWS提供程序团队是跟踪这种类型的各种错误。这个问题说,提供者版本3.70.0修复了一些这些错误,所以我建议确保您至少运行该版本作为第一步。然而,存在aws_iam_policy,这两种资源类型密切相关,因此在这方面可能存在相同的bug。如果您已经在运行该提供程序的最新版本,那么我认为这里最好的方法是通过向同一个GitHub问题添加另一个注释来报告这一点,因此提供者团队将意识到这一点。

很抱歉,我没有一个只能在Terraform模块中实现的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74043276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档