Terraform:如果父级部分完成但有错误,是否会创建依赖资源?
Terraform: will dependent resource get created if parent partially completes with error?
请注意,这是一个关于定制构建提供程序如何处理错误流的可能性的设计问题。流量好不好。。。那是另一个问题。
假设有 2 个资源(A 和 B),其中 B 依赖于 A。
当我 运行 terraform apply 时,资源 A 被创建(意味着后端创建了一个带有 ID 的对象),但在创建任务后处于错误(错误)状态。我想要构建的是一个能够识别这种不良状态的提供者,并在它继续尝试创建资源 B 之前停止在那里。不过,我还想要一种让 Terraform 能够清理的方法该资源处于不良状态(通过销毁或污染),甚至在我手动修复后端问题后无需重新创建它就继续前进。
也许还有其他流程的可能性,但我能想到的有两个:
由于后端给了我们一个 ID,我们也在 Terraform 资源中设置了 ID,但是 return 从 Create 方法中出错。但是,我不确定 Terraform 接下来会做什么。它可以:
一个。继续并尝试创建资源 B,因为 A 有一个 ID(不需要)
乙。拒绝尝试创建资源 B,因为创建 A 时 return 出错(需要)
据我所知,Terraform 的默认行为似乎是执行选项 A(如果我错了请纠正我)。 我可以让它执行选项 B 吗?
另一个选项是不设置 Terraform ID,即使现在后端有一个对象确实有 ID。好消息是 Terraform 不会继续使用资源 B,但坏消息是资源 A 实际上变成了孤儿;它存在于后端,但 Terraform 无法清理它。
我猜这不是一个独特的用例,但我还没有找到基于文档的解决方案。如有任何指导,我们将不胜感激!
What I would like to build is a provider that is able to recognize this bad state, and stop there before it goes on trying to create resource B.
这就是 HashiCorp、供应商和社区维护的大多数(如果不是全部)提供程序的工作方式。
资源 ID 的存在(或缺失)对错误处理没有任何影响。
资源具有 ID 是惯例,即使它处于 pending/failure 状态。资源代码应始终尽快设置 ID(通常在 API 第一次成功响应之后, 在 任何重试逻辑之前)。资源实际上与其 ID 同生同死。删除其 ID 意味着从状态中删除资源,并且仅当资源 实际上 消失时才会发生(例如 API returns 404)。
在任何 apply
或 destroy
操作期间,Terraform 将始终尝试尽可能远。它将遍历配置中所有资源的图表,如果发生错误(即从 C/R/U/D 方法返回),它将仅保留 creating/updating/destroying 那些未受影响的资源 错误 - 基本上所有不依赖于失败资源的资源。您可以通过 terraform graph
.
检查 Terraform 做出决策的完整依赖关系图
例如,如果您有 aws_s3_bucket_object
依赖于(通过插值语法或通过 depends_on
)aws_s3_bucket
并且 aws_s3_bucket
的 creation/update/destruction 失败任何原因 aws_s3_bucket_object
将保持不变。
What I would also like, though, is a way for Terraform to be able to clean up that resource in an bad state (via destroy or taint), or even move forward without re-creating it after I fix the issue on the backend manually.
它或多或少是一种设计选择 而不是 在发生故障时执行任何自动回滚(例如销毁处于 "failed" 状态的资源)。任何操作都可能以多种方式失败,并且最佳回滚策略的意见因上下文而异,因此 Terraform 有意将其留给 operator/user.
然而污染是另一回事,因为它不直接影响资源并且仍然将最终决定权留给用户。
目前无法从CRUD/schema界面自动taint
资源,但至少one Github issue讨论了这个想法。
可能相关: 有时资源操作需要多次 API 调用,其中任何一个都可能失败。 Terraform 有一个名为 "Partial State" 的概念来解决 https://www.terraform.io/docs/plugins/provider.html#resource-data
中描述的部分故障
基本上它总是确保在返回错误之前存储部分状态。
请注意,这是一个关于定制构建提供程序如何处理错误流的可能性的设计问题。流量好不好。。。那是另一个问题。
假设有 2 个资源(A 和 B),其中 B 依赖于 A。
当我 运行 terraform apply 时,资源 A 被创建(意味着后端创建了一个带有 ID 的对象),但在创建任务后处于错误(错误)状态。我想要构建的是一个能够识别这种不良状态的提供者,并在它继续尝试创建资源 B 之前停止在那里。不过,我还想要一种让 Terraform 能够清理的方法该资源处于不良状态(通过销毁或污染),甚至在我手动修复后端问题后无需重新创建它就继续前进。
也许还有其他流程的可能性,但我能想到的有两个:
由于后端给了我们一个 ID,我们也在 Terraform 资源中设置了 ID,但是 return 从 Create 方法中出错。但是,我不确定 Terraform 接下来会做什么。它可以:
一个。继续并尝试创建资源 B,因为 A 有一个 ID(不需要)
乙。拒绝尝试创建资源 B,因为创建 A 时 return 出错(需要)
据我所知,Terraform 的默认行为似乎是执行选项 A(如果我错了请纠正我)。 我可以让它执行选项 B 吗?
另一个选项是不设置 Terraform ID,即使现在后端有一个对象确实有 ID。好消息是 Terraform 不会继续使用资源 B,但坏消息是资源 A 实际上变成了孤儿;它存在于后端,但 Terraform 无法清理它。
我猜这不是一个独特的用例,但我还没有找到基于文档的解决方案。如有任何指导,我们将不胜感激!
What I would like to build is a provider that is able to recognize this bad state, and stop there before it goes on trying to create resource B.
这就是 HashiCorp、供应商和社区维护的大多数(如果不是全部)提供程序的工作方式。
资源 ID 的存在(或缺失)对错误处理没有任何影响。
资源具有 ID 是惯例,即使它处于 pending/failure 状态。资源代码应始终尽快设置 ID(通常在 API 第一次成功响应之后, 在 任何重试逻辑之前)。资源实际上与其 ID 同生同死。删除其 ID 意味着从状态中删除资源,并且仅当资源 实际上 消失时才会发生(例如 API returns 404)。
在任何 apply
或 destroy
操作期间,Terraform 将始终尝试尽可能远。它将遍历配置中所有资源的图表,如果发生错误(即从 C/R/U/D 方法返回),它将仅保留 creating/updating/destroying 那些未受影响的资源 错误 - 基本上所有不依赖于失败资源的资源。您可以通过 terraform graph
.
例如,如果您有 aws_s3_bucket_object
依赖于(通过插值语法或通过 depends_on
)aws_s3_bucket
并且 aws_s3_bucket
的 creation/update/destruction 失败任何原因 aws_s3_bucket_object
将保持不变。
What I would also like, though, is a way for Terraform to be able to clean up that resource in an bad state (via destroy or taint), or even move forward without re-creating it after I fix the issue on the backend manually.
它或多或少是一种设计选择 而不是 在发生故障时执行任何自动回滚(例如销毁处于 "failed" 状态的资源)。任何操作都可能以多种方式失败,并且最佳回滚策略的意见因上下文而异,因此 Terraform 有意将其留给 operator/user.
然而污染是另一回事,因为它不直接影响资源并且仍然将最终决定权留给用户。
目前无法从CRUD/schema界面自动taint
资源,但至少one Github issue讨论了这个想法。
可能相关: 有时资源操作需要多次 API 调用,其中任何一个都可能失败。 Terraform 有一个名为 "Partial State" 的概念来解决 https://www.terraform.io/docs/plugins/provider.html#resource-data
中描述的部分故障基本上它总是确保在返回错误之前存储部分状态。