首页 > 解决方案 > 当说必须更换数据库实例时,应用 Terraform 计划是否安全?

问题描述

我正在导入现有资源 (AWS RDS),但该terraform plan命令显示了一个摘要:

#aws_db_instance.my_main_db must be replaced 
+/- resource "aws_db_instance" "my_main_db" {
~ address = x
allocated_storage = x
+ apply_immediately = x
~ arn = x
~ username = x
+ password = x
(others arguments with alot of +/- and ~)
}

my_main_db与持久数据在线。我的问题是标题;现有数据库运行安全terrafrom apply吗?我不想丢失所有客户数据。

标签: amazon-web-servicesterraformamazon-rds

解决方案


在 Terraform 的术语中,“替换”是指销毁现有对象并创建一个新对象来替换它。符号(与+/-相对-/+)表示此特定资源将在“销毁前创建”模式下被替换,在该模式下,操作期间将短暂存在两个数据库实例。(这在实践中可能可行,也可能不可行,具体取决于实例名称是否作为此操作的一部分而更改。)

特别是,销毁实例相当于在aws_db_instanceRDS 控制台中删除实例:除非您有数据库内容的备份,否则它将丢失。即使您确实有备份,您也需要通过 RDS 控制台或 API 而不是使用 Terraform 来恢复它,因为 Terraform 不知道备份/恢复机制,因此它的“创建”想法是完全生成一个新的空数据库。

总而言之:直接应用这样的计划通常肯定不是“安全的”,因为 Terraform 计划销毁您的数据库及其所有内容。

如果您需要对数据库进行更改而无法在不创建全新 RDS 实例的情况下执行,您通常需要使用 RDS 特定工具在 Terraform 之外进行这些更改,以便您可以实现一些流程以在新旧实例,无论是备份然后恢复(这将需要临时中断)还是临时运行两个实例并设置从旧实例到新实例的复制,直到您准备好关闭旧实例。这种迁移的细节超出了 Terraform 的范围,因为它们特定于您使用的任何数据库引擎。


推荐阅读