Blog

Ersetzen Sie Terraform-Ressourcen basierend auf anderen Änderungen mit replace_triggered_by

Laurens Knoll

Laurens Knoll

Aktualisiert Oktober 15, 2025
3 Minuten

Terraform hat in Version 1.2 das Argument replace_triggered_by lifecycle hinzugefügt. Mit diesem Argument können Sie eine Ressource ersetzen, wenn sich eine andere Ressource ändert.

Sie fragen sich wahrscheinlich, warum Sie das brauchen - und Sie haben Recht damit. Normalerweise funktioniert Terraforms Standard-Abhängigkeitsmanagement einwandfrei. Manchmal möchten Sie jedoch Ihre VM ersetzen, denn auch wenn Sie das Startskript ohne Ersatz aktualisieren können, möchten Sie eine neue Instanz für Ihre eigene Vernunft. Dieser Blog zeigt Ihnen, wie Sie dies mit dem Argument replace_triggered_by lifecycle erreichen können.

Das Argument replace_triggered_by für den Lebenszyklus verstehen

Das Argument replace_triggered_by lifecycle verweist auf verwaltete Ressourcen und/oder Attribute. Wenn sich die referenzierte Ressource oder das referenzierte Attribut ändert, wird die Ressource ersetzt. Im folgenden Beispiel ersetzt jede Änderung an der Ressource foo_value.foo die Ressource foo_value.bar.

resource "foo_value" "foo" {
  value = "foo"
}

resource "foo_value" "bar" {
  value = "bar"

  lifecycle {
    replace_triggered_by = [
      foo_value.foo,
    ]
  }
}

Bitte beachten Sie, dass Variablen, Datenquellen und Module nicht unterstützt werden, da die Funktion auf geplante Aktionen für Ressourcenadressen angewiesen ist. Bei Bedarf können Sie die Ressource terraform_data verwenden, um ein ressourcenähnliches Verhalten hinzuzufügen. In dem folgenden Beispiel wird die Ressource terraform_data.bar ersetzt, wenn sich der Inhalt von local_file.foo ändert, indem die Ressource terraform_data.local_file_foo verwendet wird.

terraform {
  required_version = "~> 1.4.0"
}

data "local_file" "foo" {
  filename = "./foo.txt"
}

resource "terraform_data" "local_file_foo" {
  input = data.local_file.foo.content_sha256
}

resource "terraform_data" "bar" {
  input = "bar"

  lifecycle {
    replace_triggered_by = [
      terraform_data.local_file_foo,
    ]
  }
}

Finden Sie weitere Beispiele und tragen Sie Ihren Anwendungsfall zu unserem GitHub-Repository bei.

Ersetzen einer VM, wenn sich das Startskript ändert

Die Ressource Google Compute Instance hat ein spezielles Argument: metadata_startup_script. Wenn Sie diesen Wert ändern, wird die VM ersetzt. Leider ist diese Funktion nur für das Startskript implementiert, während Windows-VMs auch über ein sysprep-Skript verfügen. Das nächste Beispiel verwendet replace_triggered_by, um eine VM zu ersetzen, wenn sich das Sysprep- oder Startup-Skript ändert.

terraform {
  required_version = "~> 1.2.0"
}

resource "google_compute_instance" "my_vm" {
  name         = "my-vm"

  boot_disk {
    initialize_params {
      image = "projects/windows-cloud/global/images/family/windows-2022"
    }
  }

  metadata = {
    "sysprep-specialize-script-ps1" = file("${path.module}/assets/task_runner_sysprep.ps1")
    "windows-startup-script-ps1"    = file("${path.module}/assets/task_runner_startup.ps1")
  }

  lifecycle {
    replace_triggered_by = [
      null_resource.my_vm_replacement_trigger,
    ]
  }
}

resource "null_resource" "my_vm_replacement_trigger" {
  triggers = {
    "startup_script" = filesha256("${path.module}/assets/task_runner_startup.ps1")
    "sysprep_script" = filesha256("${path.module}/assets/task_runner_sysprep.ps1")
  }
}

Fazit

Terraforms eingebautes Abhängigkeitsmanagement funktioniert normalerweise einwandfrei. Manchmal möchten Sie jedoch die Ersetzung von Ressourcen aufgrund anderer Änderungen erzwingen. In diesem Fall steht Ihnen das Argument replace_triggered_by lifecycle zur Verfügung.

Bild von Marta von Pixabay.

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.