Terraform-Anwendungsfehler existiert bereits auf unberührten Ressourcen

Terraform-Anwendungsfehler existiert bereits auf unberührten Ressourcen

Ich starte ein neues Terraform-Projekt und folge dabei der offiziellen Anleitung:

https://learn.hashicorp.com/tutorials/terraform/gke?in=terraform/kubernetes&utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS&_ga=2.91746777.2118895439.1637849824-960084622.1637849824

Ich habe es geschafft, es zum Laufen zu bringen. (Ich führe es als Teil einer Google Cloud Build-Aufgabe aus, die beim Commit ausgelöst wird.)

Wenn ich jedoch etwas an einer Ressource ändere (z. B. den Standardwert „gke_num_nodes“ von 2 auf 1 ersetzt habe), terraform applyerhalte ich beim erneuten Ausführen Folgendes:


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" {

Gibt es eine Möglichkeit, es so einzustellen, dass nicht versucht wird, vorhandene, unberührte Ressourcen neu zu erstellen?

Meine cloudbuild.jsonist wie folgt:

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

mit prepare-terraform.sheinfach sein

terraform init
terraform plan
terraform apply -auto-approve

Antwort1

Wenn Sie Terraform zum Erstellen von Ressourcen verwenden,NICHTÄndern Sie sie außerhalb von Terraform.

Wenn Sie etwas manuell ändern, versucht Terraform, es so wiederherzustellen, wie es die HCL deklariert und wie Terraform es gespeichert hat.

Das nennt mandeklarativ. Sie versuchen, Terraform dynamisch zu machen, was die Verwendung von Terraform von vornherein ausschließt.

Antwort2

Der Terraform-Status muss dort gespeichert werden, wo er für alle Builds zugänglich ist. Beispielsweise in einem Google Cloud Bucket, wie hier zu sehen:https://www.terraform.io/docs/language/settings/backends/gcs.html

verwandte Informationen