【问题标题】:Terraform, "ignore_changes" and sub-blocksTerraform、“ignore_changes”和子块
【发布时间】:2018-06-22 23:04:05
【问题描述】:

我在 terraform 文件中配置了 AWS CodePipeline,如下所示:

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 API 使用 aws codepipeline get-pipeline &lt;name&gt; 输出它:

"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"]

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

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

【问题讨论】:

    标签: amazon-web-services terraform aws-codepipeline


    【解决方案1】:

    terraform plan 输出提示的这种语法解决了问题:

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

    另一种解决方法是添加GITHUB_TOKEN系统环境变量,以token为值。这样你就不需要 tf 文件中的ignore_changes 指令了。

    【讨论】:

    • 很高兴您找到了解决此问题的方法,但这是资源中的错误,应作为问题提出。如果您愿意这样做,您可以提出它here,以便为其他人修复它,这意味着您可以删除您的ignore_changes 节。
    • 自从我写了这个问题,我从文档中发现你也可以使用GITHUB_TOKEN 系统环境,然后阻止它发生。我的意思是,出于安全原因,AWS 没有给你 github 令牌的值,那么 terraform 怎么知道这个值没有改变呢?
    • 这帮助我解决了 Azure 应用服务获取大量应用设置由基础结构(例如,Azure DevOps 部署)添加的问题,我不想影响 TF 计划。添加过滤后的此设置超出计划差异lifecycle { ignore_changes = [ "app_settings.APPINSIGHTS_PROFILERFEATURE_VERSION" ] }
    【解决方案2】:

    此语法已弃用

    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,
    ]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2020-08-02
    • 2022-07-06
    • 2020-01-28
    • 2021-06-26
    • 2021-03-16
    相关资源
    最近更新 更多