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

我偶然发现了Terraform中的一个普遍问题。 例如,我有一个资源,如aws_autoscaling_group ,它具有desired_capacity ,可以根据CloudWatch警报进行放大或缩小。

但是,在运行terraform apply Terraform状态文件不知道这些更改,并尝试将容量设置回到在该状态中定义的初始值。

我想到了一个解决scheme,并提出了这个问题:

 # 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. 

另外,这很容易出错:例如,导入资源后,远程资源可能会更改(例如,在导入资源后会直接触发警报),所以它将不再同步。

这是预期的devise,如果是的话,我能做些什么呢?

是的,这是terraform如何工作。 它查看它的状态文件,知道它应该是你的基础设施的状态,然后它查询当前的API,基本上做一个比较,并告诉你这是改变了,我将改变这个这是你告诉我的状态。 当然你正在使用可以dynamic改变的ASG。

所以terraform作为您可以使用的生命周期选项

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

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

所以在你的情况

 lifecycle { ignore_changes = ["desired_capacity"] }