当我们启动 Cloudformation 堆栈时,我们从快照中恢复了 DBCluster。我们现在正在更新堆栈。
如果我们从配置中删除 SnapshotIdentifier 键,Cloudformation 将如何处理我们的 DBCluster?我们假设我们不使用堆栈策略。
文档表明更新该参数会导致替换。然而,这不是我们想要的,而且我们不确定该怎么做才能防止这种情况发生。
谢谢!
答案1
改变属性 DBSnapshotIdentifier 确实会导致 AWS::RDS::DBInstance 被替换。
在后台,CloudFormation (CFN) 存储所有资源的当前配置。当您更新资源时,CFN 会对这些资源进行描述调用,并将其与存储的值进行比较。
只有当值实际发生变化时,资源才会更新。也就是说,只要您不更新 DBSnapshotIdentifier 属性,数据库就不应该被替换。
对于 RDS 来说,CFN 的这种行为可能会导致令人烦恼的问题,尤其是在 RDS 端点发生变化时。
这是我们目前认为的良好做法:
- 建立一个自己的 RDS 堆栈,与其他堆栈分开。将 RDS 端点导出为“RDSEndpoint-$Version”。将 Version 设置为参数。
- 将应用程序指向正确的 RDS 端点。使用上一个堆栈的导出或使用 Route53 条目是最简单的方法。
- 如果您需要对导致替换的 RDS 实例进行更改,请在新的 RDS 堆栈上执行这些更改,并将 $Version 更改为其他内容。
- 一旦一切正常,更改应用程序中的 RDS 端点(或更改 Route53 条目,无论哪种方式最适合您)。
常见问题有:
- 数据库之间数据迁移的持续时间 - 如果您的应用程序不支持此功能,您可能会遇到问题。
- RDS 更改操作通常有点慢。通常,运行 mysqldump + mysql(如果是 MySQL)比依赖 AWS 实例更快。
- 切换到新堆栈时丢失凭证(您应该记录凭证,但无论如何都要考虑这一点)。
如果你正在寻找针对特定问题的一次性解决方案,这里有一个(可能有停机时间):
- 将您的应用程序置于只读或维护模式(如果应用程序不支持此功能,则可能会导致停机)。
- (手动或使用 RDS 快照)创建数据库的转储。
- 使用新的 CloudFormation 模板更新您的数据库
- 从转储中恢复。
- 将应用程序切换至生产环境。如果端点发生变化,也请切换。