首頁 >後端開發 >Golang >Terraform Provider Development:即使更新失敗,tfstate 也會更新

Terraform Provider Development:即使更新失敗,tfstate 也會更新

PHPz
PHPz轉載
2024-02-10 20:00:091047瀏覽

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

php小編蘋果在Terraform Provider開發中,我們常常會遇到更新失敗的情況。但是,即使更新失敗,tfstate檔案也會被更新。這是因為Terraform使用tfstate檔案來追蹤資源的狀態和設定資訊。無論是建立、更新或刪除資源,Terraform都會在tfstate檔案中記錄對應的狀態。這種設計可以確保即使在更新過程中出現問題,我們仍然可以透過tfstate檔案來獲取最新的資源狀態,從而保證了一致性和可靠性。

問題內容

所以我很好奇如何開發 terraform 提供程序,並遇到了一個我無法解釋的問題。

我的 CRUD 非常簡單,我會建立資源並在生命週期內更新其元數據,然後在銷毀命令中刪除它。

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
}

如您所看到的,更新函數傳回錯誤,這是我的問題。我故意使進程失敗,但 tfstate 仍然更新(我正在更改資源聲明中的一個變數以查看此更改)。

這是完整的資源宣告

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",
            },
        },
    }
}

我錯過了什麼?我認為更新操作失敗後不應更新 tfstate,但確實如此。我嘗試了 CRUD 和 CRUDContext 方法,在這兩種情況下它的行為都是相同的。

P/S/ terraform版本 Terraform v1.6.5,用於提供者開發使用hashicorp/terraform-plugin-sdk/v2/

解決方法

根據部落格文章,這似乎是預期的行為:一个>

「如果 Update 回呼回傳時有或沒有錯誤,則儲存完整狀態。」

另外,我發現了一些真實的工作範例,它們都在 Update 中傳回 Read 回呼。

Cloudflare 提供者 例如,GitHub 提供者

他們都這樣做:

func resourceCloudflareAccountMemberUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {

    return resourceCloudflareAccountMemberRead(ctx, d, meta)
}

以上是Terraform Provider Development:即使更新失敗,tfstate 也會更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除