【问题标题】:Unable to create a CoudFormation RDS template which provision new instance from point in time snapshots无法创建从时间点快照提供新实例的 CoudFormation RDS 模板
【发布时间】:2020-05-09 03:30:05
【问题描述】:

我正在尝试编写 CloudFormation 以从现有 RDS 数据库的时间点快照配置新的 RDS 实例。

但是,我知道在 CloudFormation 模板中提供快照时不能指定 db-name,因此它将始终将其还原到原始数据库。

我在 aws 博客上有同样的 this 文章,不过我正在寻找是否有任何开箱即用的解决方案。

编辑 1

来自我的 Cloud Formation 的 RDS sn-p

Resources:
  MyDB:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: Fn::If ["UseDbSnapshot", !Ref AWS:NoValue, !Ref MyDBName]
      DBSecurityGroups:
      - !Ref MyDbSecurityByEC2SecurityGroup
      - !Ref MyDbSecurityByCIDRIPGroup
      AllocatedStorage: 20
      DBInstanceClass: db.m1.small
      Engine: MySQL
      MasterUsername: root
      MasterUserPassword: password
      DBSnapshotIdentifier: Fn::If ["UseDbSnapshot", !Ref DBSnapshotIdentifier, !Ref AWS::NoValue]
    DeletionPolicy: Snapshot

我可以尝试什么来解决这个问题?

【问题讨论】:

  • 您可以分享您尝试执行此操作的相关 cloudformation 吗?
  • @maafk:已在原帖中更新
  • 感谢@jps 指出这一点。
  • 恢复到相同的DBName 是设计使然,因为它正在恢复 MySQL 数据库的副本。恢复后,如果要更改架构的名称,可以运行 RENAME TABLE old_db.table TO new_db.table; 之类的内容
  • @maafk AWS 控制台提供了一种方法来做同样的事情,所以我只是想知道是否有一种方法可以使用 AWS CloudFront。

标签: amazon-web-services amazon-cloudformation amazon-rds aws-cloudformation-custom-resource


【解决方案1】:

您必须记住,当您想要从快照恢复时,一些 RDS 属性(例如 MasterUsername)是不可自定义的。 AWS 文档说:

如果您指定 SourceDBInstanceIdentifier 或 DBSnapshotIdentifier 属性,请不要指定此属性。该值继承自源数据库实例或快照。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html

所以像这样省略那些参数:

Parameters:
  DBSnapshotIdentifier:
    Description: 'Optional identifier for the DB cluster snapshot from which you want to restore'
    Type: String
    Default: ''

Conditions:
  HasDBSnapshotIdentifier: !Not [!Equals [!Ref DBSnapshotIdentifier, '']]


Resources:
  DBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      ...
      DBSnapshotIdentifier: !If [HasDBSnapshotIdentifier, !Ref DBSnapshotIdentifier, !Ref 'AWS::NoValue']
      KmsKeyId: !If [HasDBSnapshotIdentifier, !Ref 'AWS::NoValue', !If [HasEncryption, !Ref KmsKey, !Ref 'AWS::NoValue']]
      MasterUsername: !If [HasDBSnapshotIdentifier, !Ref 'AWS::NoValue', !Ref MasterUsername]
      MasterUserPassword: !If [HasDBSnapshotIdentifier, !Ref 'AWS::NoValue', !Ref MasterPassword]
      StorageEncrypted: !If [HasDBSnapshotIdentifier, !Ref 'AWS::NoValue', !If 
      ...

【讨论】:

  • 感谢 user10374572 更正我的模板。我正在尝试找到一种方法来从现有 RDS 实例的时间点快照配置新实例。我了解到没有直接的方法,所以想知道可以采用哪些解决方法来实现相同的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2019-10-01
  • 2016-11-01
相关资源
最近更新 更多