Я наткнулся на общую проблему в 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.
Кроме того, это очень подвержено ошибкам: например, после импорта ресурса удаленный ресурс может измениться (например, сигнал тревоги срабатывает сразу после того, как я импортировал ресурс), поэтому он снова будет не синхронизирован.
Это задуманный дизайн, и если да, то что я могу с этим поделать?
Да, так работает terraform. Он просматривает свой файл состояния в поисках того, что, как он знает, должно быть состоянием вашей инфраструктуры, а затем запрашивает у API то, что он сейчас представляет, и в основном выполняет различие и сообщает вам, что это то, что изменилось, и я собираюсь изменить это, это состояние, которое вы мне сказали. Конечно, вы используете ASG, которые могут динамически меняться.
Так что терраформа как варианты жизненного цикла, которые вы можете использовать
https://www.terraform.io/docs/configuration/resources.html#lifecycle
Таким образом, мы можем использовать их, чтобы сообщить terraform, что вы хотите игнорировать любые изменения определенных параметров ресурса.
Так что в твоем случае
lifecycle {
ignore_changes = ["desired_capacity"]
}