繁体   English   中英

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

[英]The DB instance and EC2 security group are in different VPCs, cloudFormation error

我想自动化创建 RDS 的过程。 我想创建 RDS Aurora。
部署应用程序时,验证堆栈 cloudFormation 并且出现错误:

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

你能说有什么问题吗?

我关注了这篇文章在 Cloudformation 模板中创建 Postgres RDS 问题,但这不起作用。

这是我的 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"

您需要将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 Resource中添加对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

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

有人拍摄了快照并将其恢复到不同的 VPC,这显然不需要安全组。

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

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

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

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

无法将 postgres 从 9.6.22 升级到 9.6.11

在这一点上,我知道的唯一办法是删除 CFN 堆栈并重新运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM