Terraform 生命周期忽略更改

Mah*_*ahi 5 terraform hcl terraform-provider-aws

我正在尝试对资源资源“aws_servicecatalog_provisioned_product”中的参数应用生命周期ignore_changes规则,如下所示。

\n
resource "aws_servicecatalog_provisioned_product" "example" {\n  name                       = "example"\n  product_name               = "Example product"\n  provisioning_artifact_name = "Example version"\n\n  provisioning_parameters {\n    key   = "foo"\n    value = "bar"\n  }\n\n  provisioning_parameters {\n    key   = "key2"\n    value = lookup(var.parameter_group, "key2", "test2")\n  }\n\n  provisioning_parameters {\n    key   = "key3"\n    value = "test3"\n  }\n\n  tags = {\n    foo = "bar"\n  }\n\n  lifecycle {\n   ignore_changes = [\n    tags["foo"],\n    aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"]\n   ]\n }\n  \n}\n
Run Code Online (Sandbox Code Playgroud)\n
variable parameter_group {\n  description = "Parameters map required for modules. \n  type        = map(any)\n  default     = {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行该计划时,出现以下错误

\n
\xe2\x94\x82 Error: Unsupported attribute\n\xe2\x94\x82 \n\xe2\x94\x82   on modules/example_provision/main.tf line 28, in resource "aws_servicecatalog_provisioned_product" "example":\n\xe2\x94\x82  28:        aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"]\n\xe2\x94\x82 \n\xe2\x94\x82 This object has no argument, nested block, or exported attribute named "aws_servicecatalog_provisioned_product".\n\n
Run Code Online (Sandbox Code Playgroud)\n

我想忽略对此参数值所做的更改。标签上的忽略工作正常,但是一旦我添加第二行,即

\n

aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"]错误开始出现。

\n

在这里寻找建议/帮助:)

\n

问候

\n

Mar*_*ins 11

ignore_changes只能忽略对其声明的同一资源的配置的更改,因此您只需命名要忽略的参数,而不是资源类型或资源名称:

  lifecycle {
    ignore_changes = [
      tags["foo"],
      provisioning_parameters,
    ]
  }
Run Code Online (Sandbox Code Playgroud)

provisioning_parameters类型似乎没有表示为映射(provisioning_parameter块的标题中没有标签),因此您无法通过名称引用特定块。

但是,提供程序确实将其声明为对象列表,因此我认为您将能够通过其索引忽略特定项目,其中索引按声明顺序分配。因此,在您当前的示例中,具有索引的块key = "key2"将具有索引 1,因为它是 Terraform 从零开始计数的第二个块:

  lifecycle {
    ignore_changes = [
      tags["foo"],
      provisioning_parameters[1],
    ]
  }
Run Code Online (Sandbox Code Playgroud)


小智 6

并且,扩展马丁的答案:

如果您想忽略对某些资源的所有可能的更改,您可以使用:

  lifecycle {
    ignore_changes = all
  }
Run Code Online (Sandbox Code Playgroud)

但必须警告你两个影响..

  1. terraform 将忽略对您的资源的所有更改,因此它可能会忽略您想要的更改。当我处理模块中的资源子集并且不想被可能触发的任何其他更改分散注意力时,我通常会使用它。

  2. lifecycle块不能作为module块的一部分工作,只能在单个资源上工作。