Terraform,"ignore_changes" 和子块

Terraform, "ignore_changes" and sub-blocks

我在 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 <name>:[=18= 输出]

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

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

(说明此文字是假的。)

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

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

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

此语法已弃用

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

我遇到过类似情况,我解决如下:

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