如何在cloudformation中为`AWS :: RDS :: DBInstance`提供变量?

问题描述

我正在使用cloudformation向AWS预置RDS aurora,并在模板中使用AWS::RDS::DBClusterAWS::RDS::DBInstance资源。我有不同的环境,例如devuatprod。每个环境在群集下具有不同数量数据库实例。如何在cloudformation模板中将数据库实例的数量设置为变量?

以下是我的AWS::RDS::DBInstance模板。如您所见,模板中有三个实例。它仅用于生产,不用于开发。如何使用参数指示实例数?例如,在dev中部署1个实例,在prod中部署3个实例。

auroraDBFirstInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceClass: ${self:provider.postgresqlInstanceClass}
      Engine: aurora-postgresql
      EngineVersion: ${self:provider.postgresqlEngineVersion}
      DBClusterIdentifier: !Ref auroraDBCluster
      PubliclyAccessible: ${self:provider.publiclyAccessible}

auroraDBSecondInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceClass: ${self:provider.postgresqlInstanceClass}
      Engine: aurora-postgresql
      EngineVersion: ${self:provider.postgresqlEngineVersion}
      DBClusterIdentifier: !Ref auroraDBCluster
      PubliclyAccessible: ${self:provider.publiclyAccessible}

auroraDBThirdInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceClass: ${self:provider.postgresqlInstanceClass}
      Engine: aurora-postgresql
      EngineVersion: ${self:provider.postgresqlEngineVersion}
      DBClusterIdentifier: !Ref auroraDBCluster
      PubliclyAccessible: ${self:provider.publiclyAccessible}

解决方法

您可以将其添加为参数并在运行堆栈时传递,甚至可以进行如下映射:

Environment:
    Type: String
    AllowedValues:
      - dev
      - uat
      - prod
Mappings:
  EnvironmentToDb
    dev: 
      Cluster: 1
    uat: 
      Cluster: 2
    prod: 
      Cluster: 3

然后您可以使用以下命令引用它: DBClusterIdentifier: !FindInMap [EnvironmentToDb,!Ref 'Environment',Cluster]