Terraform,“ignore_changes”和子块

32

我有一个AWS CodePipeline在terraform文件中进行了配置,就像这样:

resource {
    name = "Cool Pipeline"
    ...

    stage {
        name = "Source"
        ...

        action {
            name = "Source"
            ...

            configuration {
                Owner = "Me"
                Repo = "<git-repo-uri>"
                Branch = develop
                OAuthToken = "b3287d649a28374e9283c749cc283ad74"
            }
        }
    }

    lifecycle {
        ignore_changes = "OAuthToken"
    }
}
忽略该令牌的原因是,AWS API不会向terraform显示该令牌,而是使用aws codepipeline get-pipeline <name>将其输出。
"pipeline": {
    "stages": {
        "name": "Source",
        "actions": {
            "configuration": {
                "OAuthToken": "****"
            }
        }
    }
}

结果是,当我执行terraform plan时,它显示希望更新该令牌,如下所示:

module.modulename.aws_codepipeline.codepipeline
      stage.0.action.0.configuration.%:          "3" => "4"
      stage.0.action.0.configuration.OAuthToken: "" => "b3287d649a28374e9283c749cc283ad74"

我的问题是,如何使ignore_changes生效?我尝试过以下方法但没有成功:

ignore_changes = ["OAuthToken"]
ignore_changes = ["oauthtoken"]
ignore_changes = ["stage.action.configuration.OAuthToken"]

我通过谷歌搜索找到的所有示例都只展示了如何在同一块级别上忽略。

(这个文本中的令牌是假的。)

3个回答

31

正如terraform plan输出所暗示的那样,这个语法解决了问题:

ignore_changes = [
    "stage.0.action.0.configuration.OAuthToken",
    "stage.0.action.0.configuration.%"
]

解决这个问题的另一种方法是添加 GITHUB_TOKEN 系统环境变量,并将令牌作为值。这样,您就不需要在 tf 文件中使用 ignore_changes 指令。


2
很高兴你找到了解决方法,但这是资源中的一个错误,应该作为问题提出。如果你愿意这样做,可以在这里提出它,这样就可以为其他人修复它,也意味着你可以删除你的ignore_changes部分。 - ydaetskcoR
自从我写了这个问题后,我从文档中发现你也可以使用GITHUB_TOKEN系统环境来防止这种情况发生。我的意思是,出于安全考虑,AWS不会向你提供github token的值,那么terraform怎么知道该值是否已更改? - Wrench
2
这帮助我解决了Azure应用服务的一个问题,即基础架构(例如Azure DevOps部署)添加了许多应用设置,而我不希望影响TF计划。通过将此设置过滤出计划差异,可以避免影响:lifecycle { ignore_changes = [ "app_settings.APPINSIGHTS_PROFILERFEATURE_VERSION" ] } - gabe

12

这种语法已经过时了。

ignore_changes = [
    "stage.0.action.0.configuration.OAuthToken",
    "stage.0.action.0.configuration.%"
]

但由于某种原因,新的版本在v1.0.0中被忽略了。

ignore_changes = [
  stage[0].action[0].configuration.OAuthToken,
  stage[0].action[0].configuration,
]

1
我可以确认,我也遇到了忽略更改(ignore_changes)未被考虑的问题,因此我已经在Github上开了一个问题 https://github.com/hashicorp/terraform/issues/28953 - Bogdan Emil Mariesan

3
我遇到过类似的情况,并采取了以下解决方法:
ignore_changes = [
   stage[0].action[0].configuration["OAuthToken"]
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接