Terraform:如何反映远程状态下的动态资源变化?

Terraform:如何反映远程状态下的动态资源变化?

我偶然发现了 Terraform 中的一个常见问题。例如,我有一个资源,例如,aws_autoscaling_group它有一个desired_capacity可以根据 CloudWatch 警报进行扩展或缩减的资源。

但是,运行时terraform applyTerraform 状态文件不知道这些变化并尝试将容量设置回状态中定义的初始值。

我想了一个解决方案并得出了以下结论:

# initialise terraform, ideally against a remote state in S3
terraform init
# remove resource from state
terraform state rm "aws_autoscaling_group.main"
# import resource from remote so it reflects the current capacity
terraform import "aws_autoscaling_group.main" "my-autoscaling-group"

但是,terraform plan随后运行时它不会反映导入的更改:

~ aws_autoscaling_group.main
      desired_capacity:          "3" => "2"
      force_delete:              "" => "true"
      metrics_granularity:       "" => "1Minute"
      wait_for_capacity_timeout: "" => "10m"
Plan: 0 to add, 1 to change, 0 to destroy.

而且,这很容易出错:例如,导入资源后,远程资源可能会发生变化(例如,导入资源后直接触发警报),因此它会再次不同步。

这是预期的设计吗?如果是,我该怎么办?

答案1

是的,这就是 terraform 的工作原理。它会查看其状态文件,了解您的基础设施的状态,然后查询 API 以了解当前状态,并进行基本差异分析,告诉您这是已更改的内容,我将对其进行更改,使其成为您告诉我的状态。当然,您使用的是可以动态更改的 ASG。

因此,您可以使用 Terraform 作为生命周期选项

https://www.terraform.io/docs/configuration/resources.html#lifecycle

因此我们可以使用这些来告诉 Terraform 你想要忽略资源中某些选项的任何更改

所以你的情况

lifecycle {
    ignore_changes = ["desired_capacity"]
}

相关内容