我已经在生产环境中运行了数十个 AWS 实例,我想开始使用 Terraform 来自动创建下一个实例。我读到过 Terraform 可以帮助实践不可变模式。但是我想避免破坏任何正在运行的实例的风险。Terraform 是否提供任何保护措施来避免这种情况?
答案1
是的 - 使用terraform plan
在任何操作之前。它将输出将要进行的更改的完整列表,而实际上执行其中任何一个,供您审阅。
答案2
Terraform 对此没有明确的保护措施,但其总体设计已经阻止它接触现有资源。
通常,每个 Terraform 资源都有一些主要标识符(例如,对于 EC2 是实例 ID,对于 S3 是存储桶名称)。并且每次 Terraform 运行都应仅 a) 创建新资源或 b) 更新/删除 Terraform 控制下的现有资源。
如果情况 a) ID 已经存在,则会出现错误,Terraform 无法创建任何内容(EC2 永远不会发生这种情况,但 S3 存储桶可能会发生这种情况)。这是修复 Terraform 代码的机会。
在情况 b) 中,Terraform 应该只使用“其自己的”资源,而不会影响您帐户的现有内容。
人们可以通过替换/重命名其资源来有意(或无意)干扰 Terraform,这会破坏一切;但在“正常”使用中我从未见过此类问题。
答案3
您可以向资源添加生命周期配置块(参见 Terraform 资源配置);具体方法是使用:
lifecycle {
prevent_destroy = true
}
当计划中包含对资源的破坏操作时,这将返回一条错误消息。