解决方案:
我在尝试对destroy
RDS 实例(不在 AWS Aurora 下)执行 a 时遇到了同样的问题,但原理是相同的。
以下是我为解决此问题而采取的一些步骤:
如果存在,则更skip_final_snapshot
改为true
并删除(请参阅下面的注释 #1 和 #2)。final_snapshot_identifier
删除backup_window
(在 AWS Aurora 下可能称为preferred_backup_window
)。
更改backup_retention_period
为0
。
确保将apply_immediately
其设置为true
(请参阅下面的评论 #3)。
运行terraform apply
并检查要影响的更改(请参阅下面的注释 #4 中的提示)。
现在您可以运行terraform destroy
并且不会出现任何错误(在我的情况下,我添加deletion_protection
了 settrue
并添加到删除它)。
评论 #1 - 了解相关领域的目的
来自Terraform 文档:
skip_final_snapshot
- (可选)确定在删除数据库实例之前是否创建最终数据库快照。如果true
指定,则不创建 DBSnapshot。如果false
指定,则在删除数据库实例之前创建数据库快照,使用值 from final_snapshot_identifier
。默认为false
。
final_snapshot_identifier
- (可选)删除此数据库实例时您的最终数据库快照的名称。skip_final_snapshot
如果设置为则必须提供false
。
在问题中指定的代码中skip_final_snapshot
是true
并且final_snapshot_identifier
仍然是指定的。
(*) 不要与snapshot_identifier
字段混淆。
评论 #2 - 是什么导致了这个错误?
对于那些想稍微了解这里发生的事情的人,在提到的未解决问题中有一个很好的线程,其中一个名为 @caiges 的贡献者在那里给出了一个很好的解释:
对于初学者,
还需要
设置skip_final_snapshot
默认值,但事实并非如此,应用了创建/更新,状态已更新 where
is but is 。
这会导致销毁操作在其验证阶段失败。False
final_snapshot_identifier
skip_final_snapshot
False
final_snapshot_identifier
null
这可以解决,但对于那些已经存在状态的人来说,我真的没有什么好故事。
一种可能性是,skip_final_shopshot
如果标识符为空,则删除操作会忽略。如果设置为或默认为 False,
另一个可能是默认final_snapshot_identifier
为随机值。我认为出于数据安全原因,忽略if
is null 是一个坏主意,最好只是随机化一个标识符。skip_final_snapshot
skip_final_snapshot
final_snapshot_identifier
评论 #3 - 确保我们的更改立即生效:
关于Terraform 文档apply_immediately
的注释:
注意:使用 apply_immediately 可能会导致服务器重新启动时短暂停机。有关更多信息,请参阅有关 RDS 维护的 AWS 文档。
评论 #4(奖励)- 为自己节省一些时间:
当您运行时,请terraform plan
确保 ~
(就地更新标志)出现在 Terraform 的执行计划下的相关字段中 - 在下面的示例中,您可以看到将应用 2 个更改:
~ resource "aws_db_instance" "postgresql" {
address = ...
allocated_storage = 100
allow_major_version_upgrade = false
.
.
~ apply_immediately = false -> true
.
.
~ backup_retention_period = 7 -> 0
.
.
tags = ...
username = ...
vpc_security_group_ids = ...
}
这听起来可能微不足道,但在出现这种错误的情况下,当您尝试了解某些更新未发生的原因时,它可以节省大量调试时间。