当 Terraform 计划表示必须更换数据库实例时,应用 Terraform 计划是否安全?

Dav*_*vuz 2 amazon-web-services amazon-rds 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 ~)
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ins 8

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

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

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

如果您需要对数据库进行更改,并且如果不创建全新的 RDS 实例就无法执行这些更改,那么您通常需要使用特定于 RDS 的工具在 Terraform 外部进行这些更改,以便您可以实现一些在 RDS 之间传输数据的过程。旧实例和新实例,无论是备份然后恢复(这将需要临时中断)还是临时运行两个实例并设置从旧实例到新实例的复制,直到您准备好关闭旧实例为止。此类迁移的详细信息超出了 Terraform 的范围,因为它们特定于您所使用的任何数据库引擎。