PHP-Editor Apple Bei der Entwicklung von Terraform Provider kommt es häufig zu Aktualisierungsfehlern. Selbst wenn die Aktualisierung fehlschlägt, wird die tfstate-Datei aktualisiert. Dies liegt daran, dass Terraform TFState-Dateien verwendet, um den Status und die Konfigurationsinformationen von Ressourcen zu verfolgen. Unabhängig davon, ob eine Ressource erstellt, aktualisiert oder gelöscht wird, zeichnet Terraform den entsprechenden Status in der tfstate-Datei auf. Dieses Design stellt sicher, dass wir auch dann, wenn während des Aktualisierungsprozesses ein Problem auftritt, immer noch den neuesten Ressourcenstatus über die tfstate-Datei erhalten können, wodurch Konsistenz und Zuverlässigkeit gewährleistet werden.
Ich war also neugierig, wie man einen Terraform-Anbieter entwickelt, und stieß auf ein Problem, das ich nicht erklären kann.
Mein CRUD ist sehr einfach: Ich erstelle die Ressource, aktualisiere ihre Metadaten während des Lebenszyklus und lösche sie dann mit dem Befehl „Zerstören“.
func resourceCreate(d *schema.ResourceData, m any) error { id, err := uuid.GenerateUUID() if err != nil { return err } d.SetId(id) return nil } func resourceRead(d *schema.ResourceData, m any) error { return nil } func resourceUpdate(d *schema.ResourceData, m any) error { return errors.New("failed") } func resourceDelete(d *schema.ResourceData, m any) error { d.SetId("") return nil }
Wie Sie sehen, gibt die Update-Funktion einen Fehler zurück, was mein Problem war. Ich lasse den Prozess absichtlich fehlschlagen, aber tfstate wird immer noch aktualisiert (ich ändere eine Variable in der Ressourcendeklaration, um diese Änderung zu sehen).
Dies ist die vollständige Ressourcenaufstellung
func demoResource() *schema.Resource { return &schema.Resource{ Description: "descr", Create: resourceCreate, Read: resourceRead, Update: resourceUpdate, Delete: resourceDelete, // CreateContext: demoResCreate, // ReadContext: demoResRead, // UpdateContext: demoResUpdate, // DeleteContext: demoResDelete, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(10 * time.Minute), Update: schema.DefaultTimeout(10 * time.Minute), Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, Required: true, Description: "name", }, }, } }
Was habe ich verpasst? Ich dachte, tfstate sollte nicht aktualisiert werden, nachdem der Aktualisierungsvorgang fehlgeschlagen ist, aber das tut es. Ich habe die Methoden CRUD und CRUDContext ausprobiert und es verhält sich in beiden Fällen gleich.
P/S/
terraform版本
Terraform v1.6.5,用于提供商开发使用hashicorp/terraform-plugin-sdk/v2/
Dies scheint laut dem Blog-Beitrag ein erwartetes Verhalten zu sein: 一个>
„Wenn der Update
Rückruf mit oder ohne Fehler zurückkommt, speichern Sie den vollständigen Status
Außerdem habe ich einige echte Arbeitsbeispiele gefunden, die alle Update
中返回 Read
im Read
-Rückruf zurückgeben.
Cloudflare-Anbieter Zum Beispiel GitHub-Anbieter
Das machen sie alle:
func resourceCloudflareAccountMemberUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { return resourceCloudflareAccountMemberRead(ctx, d, meta) }
Das obige ist der detaillierte Inhalt vonTerraform-Provider-Entwicklung: tfstate-Updates, auch wenn die Aktualisierung fehlschlägt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!