Terraform模块中替代lifecycle阻止terraform destroy的最优资源方案
问题描述
我有一个仅包含module的Terraform文件,希望禁止任何人执行terraform destroy操作。常规做法是在资源中添加包含prevent_destroy = true的lifecycle块,但module不支持lifecycle。我曾考虑修改模块内部加入可配置的lifecycle块,但该块仅接受字面量值而非变量。另一种方案是添加一个无实际功能的资源来承载lifecycle块,只要该资源设置了prevent_destroy = true就能阻止destroy命令。请问在Cloud Foundry提供商、Terraform 1.7.5版本下,哪种资源类型最经济,不会产生额外云成本或安全风险?
解决方案
最经济且无风险的选择是使用Terraform核心内置的**null_resource**:
- 这是纯虚拟资源,不会与Cloud Foundry API交互,也不会在Cloud Foundry环境中创建任何实际资源,完全无额外云成本,也不存在安全风险。
- 它仅存在于Terraform状态文件中,当执行
terraform destroy时,Terraform会尝试销毁该资源,但由于设置了prevent_destroy = true,会直接报错并终止整个销毁流程,完美实现阻止销毁的需求。
示例代码:
resource "null_resource" "prevent_destroy" { lifecycle { prevent_destroy = true } }
如果必须使用Cloud Foundry提供商的资源,可以选择cloudfoundry_user_provided_service_instance,创建一个空的用户提供服务实例。不过该资源会在Cloud Foundry中生成一个无实际功能的实例,虽然通常无成本,但相比null_resource多了云环境的资源创建操作,轻量化程度不如前者。
内容的提问来源于stack exchange,提问作者John Skiles Skinner
相关产品推荐
相关产品推荐

