数据库实例和EC2安全组在不同的VPC,cloudFormation错误

Posted

技术标签:

【中文标题】数据库实例和EC2安全组在不同的VPC,cloudFormation错误【英文标题】:The DB instance and EC2 security group are in different VPCs, cloudFormation error 【发布时间】:2019-12-22 17:42:23 【问题描述】:

我想自动化创建 RDS 的过程。我想创建 RDS Aurora。 部署应用程序时,堆栈 cloudFormation 被验证,我有一个错误:

发生错误:DatabaseCluster - 数据库实例和 EC2 安全组位于不同的 VPC。

你能说一下有什么问题吗?

我关注了这个帖子Issue with creating a Postgres RDS in Cloudformation Template,但这不起作用。

这是我的 serverless.yml 文件的一部分

resources:
  Resources:
    DatabaseCluster:
      Type: AWS::RDS::DBCluster
      Properties:
        DatabaseName: name$opt:stage, self:provider.stage
        Engine: aurora
        MasterUsername: $ssm:MasterUsername-$opt:stage, self:provider.stage
        MasterUserPassword: $ssm:MasterUserPassword-$opt:stage, self:provider.stage
        Port: "3306"
        VpcSecurityGroupIds:
          - !Ref VpcSecurityGroup

    ServerlessRDS:
      Type: AWS::RDS::DBInstance
      Properties:
        Engine: aurora
        DBClusterIdentifier: !Ref "DatabaseCluster"
        DBInstanceIdentifier: db-name-$opt:stage, self:provider.stage
        DBInstanceClass: db.t2.medium
        VPCSecurityGroups:
          - !Ref VpcSecurityGroup
        DBSubnetGroupName: !Ref myDBSubnetGroup


    VpcSecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        VpcId:
          Ref: ServerlessVPC
        GroupDescription: "Allow all traffic"
        SecurityGroupEgress:
          - IpProtocol: -1
            CidrIp: 0.0.0.0/0
        SecurityGroupIngress:
          - IpProtocol: -1
            CidrIp: 0.0.0.0/0

    ServerlessVPC:
      Type: AWS::EC2::VPC
      Properties:
        CidrBlock: "10.0.0.0/16"

    myDBSubnetGroup:
      Type: "AWS::RDS::DBSubnetGroup"
      Properties:
        DBSubnetGroupDescription: "description"
        SubnetIds:
          - !Ref ServerlessSubnetA
          - !Ref ServerlessSubnetB
    ServerlessSubnetA:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId:
          Ref: ServerlessVPC
        AvailabilityZone: "eu-west-1b"
        CidrBlock: "10.0.0.0/24"
    ServerlessSubnetB:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId:
          Ref: ServerlessVPC
        AvailabilityZone: "eu-west-1a"
        CidrBlock: "10.0.1.0/24"

【问题讨论】:

【参考方案1】:

您需要将DBSubnetGroupName 参数添加到AWS::RDS::DBCluster 资源。

DatabaseCluster:
  Type: AWS::RDS::DBCluster
  Properties:
    DatabaseName: name$opt:stage, self:provider.stage
    Engine: aurora
    MasterUsername: $ssm:MasterUsername-$opt:stage, self:provider.stage
    MasterUserPassword: $ssm:MasterUserPassword-$opt:stage, self:provider.stage
    Port: "3306"
    VpcSecurityGroupIds:
      - !Ref VpcSecurityGroup
    DBSubnetGroupName:
      Ref: myDBSubnetGroup

此外,您可能希望在 VpcSecurityGroup 资源中添加对 ServerlessSubnetAServerlessSubnetB 的显式依赖,以通过服务创建某种组资源并避免任何竞争条件。

VpcSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    DependsOn: 
    - ServerlessSubnetA
    - ServerlessSubnetB
    Properties:
      VpcId:
        Ref: ServerlessVPC
      GroupDescription: "Allow all traffic"
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
      SecurityGroupIngress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0

【讨论】:

【参考方案2】:

遇到这种情况,发现有人修改了dBs VPC。

有人拍摄了快照并将其还原到不同的 VPC,而该 VPC 显然不需要安全组。

这可能是因为与数据库通信的网站运行在不同的 VPC 上。

要解决它,您需要做出一个艰难的决定,因为此时您可能最终不得不将整个事情吹走,如果它是一组 CFN 模板的一部分,那么这可能会给多米诺骨牌效应带来更多问题.

您可能值得尝试将 dB 恢复到 CFN 模板认为它所在的原始 VPC(或更改子网组/VPC)以及安全组由 CFN 模板创建的位置,并且然后重新运行 CFN 模板。

如果失败,例如最近更新了数据库版本,您可能会遇到以下问题:

无法将 postgres 从 9.6.22 升级到 9.6.11

此时,我知道的唯一办法是删除 CFN 堆栈并重新运行它。

【讨论】:

以上是关于数据库实例和EC2安全组在不同的VPC,cloudFormation错误的主要内容,如果未能解决你的问题,请参考以下文章

如果我们使用默认 VPC 和安全组将公开访问设置为“否”,为啥 EC2 实例无法访问 RDS 实例?

SSH到位于VPC中的私有子网中的AWS EC2实例

如果我的安全组在端口 22 上允许 TCP 并且没有网络访问控制列表,为啥我不能通过 SSH 连接到我的 EC2 实例?

EC2 VPC 实例 - 过滤端口

使用不同的 SSH 密钥部署私有 EC2 实例(例如 Ec2.pem)和堡垒主机(例如 BastionKey.pem) - AWS VPC

ssh 隧道/端口转发无法通过 EC2 实例工作到 VPC 中的 Elasticsearch 集群