具有 Cloud Formation 和 AZ 问题的 RDS

Posted

技术标签:

【中文标题】具有 Cloud Formation 和 AZ 问题的 RDS【英文标题】:RDS with Cloud Formation and AZ issues 【发布时间】:2016-02-16 18:50:17 【问题描述】:

我正在使用云形成来创建包含 RDS 实例的设置。

由于以下错误,我在创建 RDS 实例时遇到了一些困难:

数据库子网组不满足可用区覆盖要求。 请添加子网以覆盖至少 2 个可用区。当前的 覆盖范围:1

问题是整个设置都在一个 AZ 上……我该怎么办?只是在不同的 AZ 中创建一个额外的子网,其中没有任何内容仅用于 RDS?

也许 AWS 可以通过某种方式自动创建该子网,让我摆脱混乱。我不想要那个额外的子网,也不想让我的用户为此选择另一个可用区。

【问题讨论】:

答案是肯定的,没有别的选择 这也适用于 DMS(数据库迁移服务)。正如您所说,创建另一个子网可以解决问题。 【参考方案1】:

是的,即使对于完全包含在单个可用区 [AZ] 中的部署,您也必须在不同的 AZ 中创建一个额外的子网并将其包含在您的数据库子网组中。此要求的基本原理是支持高可用性多可用区部署,如 RDS 用户指南的Working with a DB Instance in a VPC 部分所述:

对于多可用区部署,为一个区域中的两个或多个可用区定义子网允许 Amazon RDS 在需要时在另一个可用区中创建新的备用。即使是单可用区部署,您也需要这样做,以防万一您想在某个时候将它们转换为多可用区部署。

至于不让您的用户为此选择另一个 AZ 造成负担,有一些方法可以做到这一点。例如,您可以使用 Fn::GetAZs 和 Fn::Select 内部函数自动选择辅助 AZ。如果您允许用户选择主要 AZ,您还需要 Condition 以确保辅助 AZ 不等于所选的主要 AZ。

这是一个示例模板 sn-p:

Parameters:
  PrimaryAZ:
    Type: AWS::EC2::AvailabilityZone::Name
    Description: Primary AZ
Conditions:
  IsFirstPrimaryAZ:
    Fn::Equals:
    - !Ref PrimaryAZ
    - Fn::Select [0, Fn::GetAZs: ""]
Resources:
  Subnet1:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: !Ref PrimaryAZ
      # ...
  Subnet2:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone:
        Fn::If:
        - IsFirstPrimaryAZ
        - Fn::Select [1, Fn::GetAZs: ""]
        - Fn::Select [0, Fn::GetAZs: ""]
      # ...

【讨论】:

您的Fn::If 不应该是IsFirstPrimaryAZ 而不是FirstAZ 是的,看起来像是错字,感谢您的更正! 不应该PrimaryAZ 低于Parameters,而不是Properties 是的,又一个错字,感谢指正! (我从未真正执行过这个模板代码,只是勾勒出了 sn-p。) 我有不同但相关的问题。由于两个 AZ 但 DB 是单个 AZ 的目标,这会导致任何访问问题吗?我提供了两个公共子网和两个私有子网,但我注意到现在对 db 的访问非常慢。在使用其他一些数据库之前,我提供了一个公共子网和两个私有子网,并且工作正常。但是对于带有一个公共子网的新数据库(mssql),我无法从公共 ip 访问,所以我需要提供另一个公共子网并且它可以工作。但是现在访问很慢。【参考方案2】:

只是添加有关此问题的更多详细信息。 我解决了在 RDS > 子网组评估子网组的问题。 (子网组是一个仅存在于RDS上下文中的概念,不存在于VPC上下文中)

在我的情况下,我第一次尝试创建 RDS mysql 时自动创建了一个子网组,并选择了我的个性化 VPC(不是默认 VPC),但我认为 RDS 脚本创建了一个子网组,从我的 VPC 中选择了前 3 个子网:

subnet1 区域 1a, 子网 2 区域 1a, subnet3 区域 1b

我创建了 3 个私有子网用于 RDS:

subnet4 区域 1a, 子网 5 区域 1b,

subnet6 区域 1c

无法修改子网组,然后我创建了一个,然后选择了 3 个具有相同 acl 和路由配置的子网,每个子网位于不同的区域(1a、1b、1c)。然后我删除了另一个配置错误的子网组。 返回 RDS 仪表板,单击 Create RDS,选择所需的所有数据库详细信息,选择所需的 VPS,然后您会看到选定的子网组名称。问题解决了。

【讨论】:

【参考方案3】:

是的。只需删除其中一个子网,然后使用不同的可用区再次创建相同的子网。

【讨论】:

【参考方案4】:

创建一个与其他主题具有不同可用区的新主题

【讨论】:

以上是关于具有 Cloud Formation 和 AZ 问题的 RDS的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Cloud Formation 获取 Elastic Container Repository URI?

如何在 AWS Cloud Formation 中实施嵌套堆栈?

在 Cloud Formation 中为 SQS 创建 VPC 接口端点

以下 AWS Cloud Formation 错误?

如何使用 Cloud Formation 模板自动扩展 DynamoDB?

我能否在 SAM 模板中使用 AWS Cloud Formation 资源语法,反之亦然?