Как сохранить ресурс terraform после рефакторинга для использования в for_each?

#foreach #terraform

#инструкция foreach #терраформирование

Вопрос:

В настоящее время я занимаюсь небольшим рефакторингом нашей инфраструктуры. Моя текущая версия моего проекта похожа на следующую: И я пытаюсь использовать for_each для повторного использования переменных.

 resource "google_cloud_scheduler_job" "job" {  name = "Create_All_Dossier_Summary"  description = "desc1"  schedule = "0 19 * * 1"  time_zone = "America/Sao_Paulo"  attempt_deadline = "320s"   retry_config {  retry_count = 1  }   http_target {  http_method = "POST"  uri = "lt;some-urlgt;"  } }  

И я пытаюсь обновить его до чего-то вроде следующего:

 variable "description" {  default = ["desc1", "desc 2"] }  resource "google_cloud_scheduler_job" "job" {  for_each = toset(var.description)  name = "Create_All_Dossier_Summary"  description = each.value  schedule = "0 19 * * 1"  time_zone = "America/Sao_Paulo"  attempt_deadline = "320s"   retry_config {  retry_count = 1  }   http_target {  http_method = "POST"  uri = "lt;some-urlgt;"  } }  

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

Есть ли способ сказать terraform, чтобы он не воссоздавал этот первый ресурс после выполнения этого рефакторинга?

 Plan: 2 to add, 0 to change, 1 to destroy. # google_cloud_scheduler_job.job will be destroyed # google_cloud_scheduler_job.job["desc 2"] will be created # google_cloud_scheduler_job.job["desc1"] will be created  

Кстати: Я пытаюсь использовать список объектов, я использовал список строк здесь, потому что это проще продемонстрировать.

Ответ №1:

Когда пространство имен/адрес ресурса изменяется в конфигурации Terraform, вы должны переименовать его соответствующий идентификатор в состоянии с state mv помощью подкоманды:

 terraform state mv google_cloud_scheduler_job.job 'google_cloud_scheduler_job.job["desc 2"]'  

Обратите внимание, что второй адрес ресурса должен быть полностью приведен в виде буквальной строки, чтобы оболочка правильно интерпретировала его как аргумент из-за использования " в синтаксисе.

Комментарии:

1. Так просто и так полезно, хе-хе, спасибо