Heim >Backend-Entwicklung >Golang >Terraform-Provider-Entwicklung: tfstate-Updates, auch wenn die Aktualisierung fehlschlägt

Terraform-Provider-Entwicklung: tfstate-Updates, auch wenn die Aktualisierung fehlschlägt

PHPz
PHPznach vorne
2024-02-10 20:00:091078Durchsuche

Terraform Provider Development:即使更新失败,tfstate 也会更新

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.

Frageninhalt

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/

Problemumgehung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen