Я хочу разделить свою инфраструктуру на две части:
Я хочу быть уверенным, что постоянная часть никогда не будет удалена, и в то же время будет опция terraform destroy в части динамической инфраструктуры.





Все ресурсы, которые вы не хотите уничтожать, вы должны добавить политику жизненного цикла: prevent_destroy
Посмотрите документацию: https://www.terraform.io/docs/configuration/resources.html#prevent_destroy
Да, но prevent_destroy просто предотвращает команду destroy, если ресурс с этой директивой планируется удалить. И я хочу иметь возможность разрушить «динамическую» часть инфраструктуры и оставить «постоянную».
Чтобы полностью предотвратить разрушение, вам нужно будет точно настроить разрешения для ресурсов у вашего провайдера. Однако есть простой способ разделить вашу инфраструктуру.
Terraform предлагает источник данных удаленного состояния, который позволяет вам использовать вывод из другого проекта, поэтому вы не сможете уничтожить эти ресурсы во время работы с динамической частью.
Можете привести пример, как решить проблему из вопроса? Насколько я понял, удаленное состояние позволяет использовать .tfstate, который больше похож на контроль версий для одного проекта, а затем на импорт вывода из другого проекта.
@AlexT Ну, вы создаете один проект для постоянной инфраструктуры, а другой - для динамической инфраструктуры. Вы работаете только над динамическим проектом, обращаетесь к выходным данным другого проекта через поставщика удаленного состояния, поэтому вы не можете ничего случайно удалить и можете запретить некоторым пользователям изменять это.
У меня немного другая работа. Ресурсы, которые я не хочу удалять с помощью "terraform destroy", я создаю как "null_resource" с помощью средства обеспечения с CLI. Вы по-прежнему можете использовать свои переменные в терраформе.
например (Создайте группу ресурсов, но она постоянна из-за null_resource)
resource "null_resource" "backend-config" {
provisioner "local-exec" {
command = <<EOT
az group create --location ${var.Location} --name ${var.Resource_group_name} --tags 'LineOfBusiness=${var.Lob}' 'Region=${var.Region}' 'Purpose = "Terraform-Primary-Resource-Group-${var.Lob}'
EOT
interpreter = ["Powershell", "-Command"]
}
}
Теперь, если вы уничтожите ресурсы с помощью terraform destroy. Любой null_resource останется нетронутым.
Я бы решил эту проблему, имея 2 развертывания Terraform. Вы создаете «статические» ресурсы один раз и не трогаете их. Для дополнительной безопасности вручную добавьте блокировку удаления для этих ресурсов (например, я знаю, что вы можете сделать это в Azure, я предполагаю, что другие облачные провайдеры имеют аналогичное решение).
Импортируйте эти ресурсы в свое развертывание Dynamic Terraform, используя блоки данные (не ресурсы). Terraform никогда не будет пытаться удалить ресурсы, которые вы импортируете с помощью блоков данных.
Я просто изучал это и не нашел никакой полезной информации. По-видимому, в terraform нет концепции постоянной инфраструктуры (назовите ее статической?), Поэтому я создал запрос функции (ссылка ниже) с возможной идеей реализации для такой, где ресурс может быть помечен как постоянный и сохранен при выполнении уничтожения terraform. Возможно, вам захочется присмотреть за github.com/hashicorp/terraform/issues/20065.