实现 Terraform 提供程序时如何处理不可删除的资源

How to handle a non deletable resource when implementing a terraform provider

我目前正在尝试使用没有删除方法的 Terraform 管理资源,而 Terraform 坚持必须有一个。

  1 error occurred:
            * resource xray_db_sync_time: Delete must be implemented

我要实现的 API 是 here, and as you can see, there is no "Delete". You can't remove this sync timer. I am open to ideas. The code being worked on is here

您还缺少为此 API 端点创建。仅支持更新和读取,您需要将创建扩展为与更新相同,只是将资源额外添加到状态。您可以轻松地为此行为调用创建函数中的更新函数。

对于删除功能,这实际上应该比您想象的要简单。 Terraform 提供程序 SDKv2 和您的资源代码应该在尝试删除之前自动读取资源以验证它确实存在(这可能不需要您在没有看到代码的情况下付出额外的努力)。然后,您需要从 d.SetId("") 的状态中删除资源,其中 d 的类型为 *schema.ResourceData。但是,假设 Delete returns 没有错误,这也会自动调用。因此,您可以定义一个仅包含 returns 适当 Go 类型的警告或错误的 Delete。如果你不需要它(并且可能不会考虑最小的功能),那么你可能只是 return nil。部分原因是基于您的代码可能的样子的推测,但总的来说这一切都是正确的。

在这种情况下,作为提供者开发人员,您需要判断如何最好地处理 Terraform 的典型资源实例生命周期与 实际 之间的这种不匹配您打算表示的对象类型的生命周期。

一般来说,有两种选择:

  • 您可以使 Delete 函数立即 return 出错,解释该对象不可删除。如果用户可能对对象继续存在感到惊讶或受到伤害,即使 Terraform 没有它的记录,这可能是一种合适的方法。我会非正式地将其称为“显式方法”,因为它让用户意识到正在发生一些不寻常的事情,并要求他们使用 terraform state rm 明确确认他们希望 Terraform 只是“忘记”而不是销毁它。
  • 您可以使 Delete 函数仅调用 d.SetId("")(向 SDK 指示该对象不再存在)并成功 return,而无需采取任何其他操作。我将此称为“隐式方法”,因为没有密切注意的用户可能会误以为该对象实际上已被删除,因为提供者没有给出任何反馈,它只是默默地丢弃了该对象。

这两种选择各有利弊,最终决定权在您。 Terraform 及其 SDK 将支持任一策略,但您需要实现 someDelete 功能,即使它什么都不做,以满足 API合同。