基于Terraform SDKv2实现父资源删除时跳过子资源删除的可行性咨询
Terraform SDKv2自定义Provider:销毁逻辑定制方案与原则分析
一、需求可行性
这个需求完全可以实现,Terraform SDKv2允许开发者在资源的生命周期方法中,根据关联资源的状态等上下文调整执行逻辑。
二、具体实现方案
核心思路是在version资源的Delete方法中,判断关联的note资源是否也在本次apply的销毁队列中:
- 若
note正被销毁,直接跳过version的删除操作(依赖服务器随note一并清理version); - 若
note未被销毁,正常执行version的删除逻辑,或根据服务器限制返回错误(符合你提到的“单独删v1失败也可接受”的要求)。
基于SDKv2的代码示例:
func resourceVersionDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { // 获取关联的note ID noteID := d.Get("note").(string) // 从Plan中检查note资源是否处于待销毁状态 plan, ok := ctx.Value(sdkv2ctx.PlanKey).(*terraform.Plan) if ok { for _, r := range plan.Diff.RootModule().Resources { // 匹配关联的note资源(需根据实际ID生成规则或资源地址调整匹配逻辑) if r.Addr.Type == "note" && isAssociatedNote(r.Addr.ID, noteID) { // 检查该note资源是否有销毁标记 if r.Destroy || r.DestroyTainted { // note正在被销毁,跳过version删除 d.SetId("") return nil } } } } // 若note未被销毁,执行正常删除逻辑或返回错误 client := meta.(*YourAPIClient) err := client.DeleteVersion(d.Id()) if err != nil { // 服务器不允许单独删除当前version时,自然返回错误,符合需求 return diag.FromErr(err) } d.SetId("") return nil } // 辅助函数:判断当前遍历到的note资源是否与version关联 func isAssociatedNote(noteResourceID, versionNoteID string) bool { // 示例逻辑,需适配你的业务ID规则 return noteResourceID == versionNoteID }
注意:实际匹配关联note资源的逻辑需要根据你的ID生成规则或资源地址格式调整,确保能准确找到对应的note并判断其销毁状态。
三、是否违背Terraform原则?
不违背Terraform的核心原则。
Terraform的核心是声明式一致性:用户编写的配置最终要和实际基础设施状态一致。
- 当用户同时删除
note和version时,最终状态是两者都不存在,和配置完全一致,符合一致性要求; - 单独删除
version时,若服务器不允许而返回错误,这是如实反映后端基础设施的限制——Terraform的职责就是将这类限制暴露给用户,引导用户调整配置(比如先新增版本再删旧版,或同时删除note)。
唯一需要注意的是,必须在Provider的文档中明确说明这种特殊的销毁逻辑,让用户清楚操作的预期结果,避免产生困惑。
内容的提问来源于stack exchange,提问作者Ferran Maylinch
相关产品推荐
相关产品推荐

