Назад | Перейти на главную страницу

Terraform: как отразить динамические изменения ресурсов в удаленном состоянии?

Я наткнулся на общую проблему в 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"]
}