我偶然发现了 Terraform 中的一个常见问题。例如,我有一个资源,例如,aws_autoscaling_group
它有一个desired_capacity
可以根据 CloudWatch 警报进行扩展或缩减的资源。
但是,运行时terraform apply
Terraform 状态文件不知道这些变化并尝试将容量设置回状态中定义的初始值。
我想了一个解决方案并得出了以下结论:
# 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"]
}