Terraform 生命周期忽略更改

问题描述 投票:0回答:2

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

resource "aws_servicecatalog_provisioned_product" "example" {
  name                       = "example"
  product_name               = "Example product"
  provisioning_artifact_name = "Example version"

  provisioning_parameters {
    key   = "foo"
    value = "bar"
  }

  provisioning_parameters {
    key   = "key2"
    value = lookup(var.parameter_group, "key2", "test2")
  }

  provisioning_parameters {
    key   = "key3"
    value = "test3"
  }

  tags = {
    foo = "bar"
  }

  lifecycle {
   ignore_changes = [
    tags["foo"],
    aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"]
   ]
 }
  
}
variable parameter_group {
  description = "Parameters map required for modules. 
  type        = map(any)
  default     = {}
}

当我运行计划时,我得到低于错误

│ Error: Unsupported attribute
│ 
│   on modules/example_provision/main.tf line 28, in resource "aws_servicecatalog_provisioned_product" "example":
│  28:        aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"]
│ 
│ This object has no argument, nested block, or exported attribute named "aws_servicecatalog_provisioned_product".

我想忽略对此参数值所做的更改。 Ignore on tags 工作正常但是一旦我添加我的第二行 aws_servicecatalog_provisioned_product.provisioning_parameters.example["key2"] 错误就开始出现了。

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

问候

terraform terraform-provider-aws hcl
2个回答
6
投票

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

  lifecycle {
    ignore_changes = [
      tags["foo"],
      provisioning_parameters,
    ]
  }

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

但是,提供者确实将其声明为对象列表,因此我认为您可以通过其索引忽略特定项目,其中索引按声明顺序分配。因此,在您当前的示例中,带有

key = "key2"
的索引将是 1,因为它是 Terraform 从零开始计数的第二个块:

  lifecycle {
    ignore_changes = [
      tags["foo"],
      provisioning_parameters[1],
    ]
  }

0
投票

并且,扩展 Martin 的回答:

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

  lifecycle {
    ignore_changes = all
  }

但必须提醒您注意 2 个含义..

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

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

© www.soinside.com 2019 - 2024. All rights reserved.