当我们从 Cloudformation 配置中删除 SnapshotIdentifier 时会发生什么

当我们从 Cloudformation 配置中删除 SnapshotIdentifier 时会发生什么

当我们启动 Cloudformation 堆栈时,我们从快照中恢复了 DBCluster。我们现在正在更新堆栈。

如果我们从配置中删除 SnapshotIdentifier 键,Cloudformation 将如何处理我们的 DBCluster?我们假设我们不使用堆栈策略。

文档表明更新该参数会导致替换。然而,这不是我们想要的,而且我们不确定该怎么做才能防止这种情况发生。

谢谢!

答案1

改变属性 DBSnapshotIdentifier 确实会导致 AWS::RDS::DBInstance 被替换。

在后台,CloudFormation (CFN) 存储所有资源的当前配置。当您更新资源时,CFN 会对这些资源进行描述调用,并将其与存储的值进行比较。

只有当值实际发生变化时,资源才会更新。也就是说,只要您不更新 DBSnapshotIdentifier 属性,数据库就不应该被替换。

对于 RDS 来说,CFN 的这种行为可能会导致令人烦恼的问题,尤其是在 RDS 端点发生变化时。

这是我们目前认为的良好做法:

  1. 建立一个自己的 RDS 堆栈,与其他堆栈分开。将 RDS 端点导出为“RDSEndpoint-$Version”。将 Version 设置为参数。
  2. 将应用程序指向正确的 RDS 端点。使用上一个堆栈的导出或使用 Route53 条目是最简单的方法。
  3. 如果您需要对导致替换的 RDS 实例进行更改,请在新的 RDS 堆栈上执行这些更改,并将 $Version 更改为其他内容。
  4. 一旦一切正常,更改应用程序中的 RDS 端点(或更改 Route53 条目,无论哪种方式最适合您)。

常见问题有:

  • 数据库之间数据迁移的持续时间 - 如果您的应用程序不支持此功能,您可能会遇到问题。
  • RDS 更改操作通常有点慢。通常,运行 mysqldump + mysql(如果是 MySQL)比依赖 AWS 实例更快。
  • 切换到新堆栈时丢失凭证(您应该记录凭证,但无论如何都要考虑这一点)。

如果你正在寻找针对特定问题的一次性解决方案,这里有一个(可能有停机时间):

  1. 将您的应用程序置于只读或维护模式(如果应用程序不支持此功能,则可能会导致停机)。
  2. (手动或使用 RDS 快照)创建数据库的转储。
  3. 使用新的 CloudFormation 模板更新您的数据库
  4. 从转储中恢复。
  5. 将应用程序切换至生产环境。如果端点发生变化,也请切换。

相关内容