Ошибка применения terraform уже существует на нетронутых ресурсах

Ошибка применения terraform уже существует на нетронутых ресурсах

Я начинаю новый проект по терраформированию, следуя официальному руководству:

https://learn.hashicorp.com/tutorials/terraform/gke?in=terraform/kubernetes&utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=СТРАНИЦА_СТАТЬИ&utm_content=ДОКУМЕНТЫ&_ga=2.91746777.2118895439.1637849824-960084622.1637849824

Мне удалось запустить его. (Я запускаю его как часть задачи сборки Google Cloud, запускаемой при фиксации)

Однако если я изменю что-то в ресурсе (например, заменю значение по умолчанию «gke_num_nodes» с 2 на 1), то при terraform applyповторном запуске я получу следующее:


Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + kubernetes_cluster_host = (known after apply)
  + kubernetes_cluster_name = "workspace-auto-gke"
  + project_id              = "workspace-auto"
  + region                  = "europe-west4"
google_compute_network.vpc: Creating...
│ Error: Error creating Network: googleapi: Error 409: The resource 'projects/workspace-auto/global/networks/workspace-auto-vpc' already exists, alreadyExists
│   with google_compute_network.vpc,
│   on vpc.tf line 15, in resource "google_compute_network" "vpc":
│   15: resource "google_compute_network" "vpc" {

Есть ли способ сделать так, чтобы не приходилось пытаться воссоздать существующие нетронутые ресурсы?

Мой cloudbuild.jsonвариант следующий:

{
  "steps": [
    {
      "name": "hashicorp/terraform",
      "entrypoint": "/bin/sh",
      "args": [
        "./cloudbuild/prepare-terraform.sh"
      ]
    }
  ],
  "logsBucket": "gs://my-bucket/logdir",
  "serviceAccount": "projects/my-proj/serviceAccounts/[email protected]"
}

с prepare-terraform.shпростотой

terraform init
terraform plan
terraform apply -auto-approve

решение1

Если вы используете Terraform для создания ресурсов, сделайте следующее:НЕТизменять их вне Terraform.

Если вы измените что-либо вручную, Terraform попытается вернуть это обратно в то состояние, в котором это объявлено в HCL и в котором Terraform это сохранил.

Это называетсядекларативный. Вы пытаетесь сделать Terraform динамичным, что изначально исключает возможность его использования.

решение2

Состояние terraform должно храниться там, где оно доступно всем сборкам. Например, в облачном контейнере Google, как показано здесь:https://www.terraform.io/docs/language/settings/backends/gcs.html

Связанный контент