是否可以在 Cloud Formation 脚本中更改 RDS 实例的逻辑 ID?

Is it possible to change the Logical ID of an RDS instance in a Cloud Formation script?

我们的应用程序(开发、测试、生产等)有多个 AWS 堆栈。这些都是使用 Cloud Formation 模板创建的。在我之前的某个聪明人决定对产品堆栈使用与其他模板不同的模板。我想合并到只有一个 Cloud Formation 模板。

我已经对两个模板进行了文件比较,唯一的区别是 RDS 实例的逻辑 ID。所以我们有这样的东西:

   "MyDbInstanceDev": {
      "Type": "AWS::RDS::DBInstance",
      "Properties": {
        "AllocatedStorage": "200",
        "CopyTagsToSnapshot" : true,
        "DBInstanceClass": "db.m3.medium",

经文:

   "MyDbInstance": {
      "Type": "AWS::RDS::DBInstance",
      "Properties": {
        "AllocatedStorage": "200",
        "CopyTagsToSnapshot" : true,
        "DBInstanceClass": "db.m3.medium",

不过,如果我将逻辑 ID 从 "MyDbInstanceDev" 更改为 "MyDbInstance",cloud formation 认为我想删除现有的 RDS 实例并在原始模板所在的堆栈中创建一个新实例a 旧的逻辑 ID。

有什么方法可以更改逻辑 ID 并使我的所有堆栈都具有相同的模板而不会丢失 DB?

没有。你不能使用 CFT 来做到这一点,因为 CFT 会维护堆栈的状态(虽然你看不到它)。即使您重命名 DBInstance,如果您尝试删除堆栈,您将在以后遇到问题。

您可以使用 DBInstanceIdentifier 作为参数,每次您要创建数据库时,您都会创建一个新的堆栈部署而不是更新堆栈。 Logical Id的CFT资源没有多大意义,除非你是auto naming的资源。

要修复现有部署,请执行以下操作:

  • 为使用的部署的数据库拍摄快照 MyDbInstanceDev.
  • 在中添加一个名为RestoreFromDBSnapshotIdentifier的参数 MyDbInstance CFT.
  • MyDbInstance中添加DBSnapshotIdentifier属性,如果RestoreFromDBSnapshotIdentifier不为空,则有条件地设置。
  • 部署。