使用CloudFormation设置AWS RDS MySQL数据库实例

时间:2020-02-23 14:32:22  来源:igfitidea点击:

本文有助于用户使用CloudFormation自动化服务创建MySQL数据库实例。
RDS代表关系数据库服务。
它是一个托管的AWS(亚马逊Web服务)服务,简化了关系数据库的设置和管理。

RDS支持各种数据库引擎。
它们包括:mysqlamazon aurorapostgresqlmaria dboraclesql服务器

使用AWS RD的好处包括:

RDS可以更轻松地配置和管理RDS数据库。
无需担心软件修补程序,也不需要通过配置实例的复杂过程并在实例上安装软件。

RDS使我们的数据库更容易扩展(读取副本)。
此外,该服务为用户提供了选项以确保高可用的设置(多AZ)。

要求/准备工作

在开始之前,安装程序将看一下下面列出的安装前要求。

用户需要提供:AWS帐户。
使用权限创建一个用户,以在AWS帐户上创建资源。
作为Visual Studio代码,如Visual Studio代码编写和编辑CloudFormation模板。
使用子网和Internet连接的VPC。
创建的数据库实例的参数组。

N/B:对于RDS MySQL数据库实例,我们无法使用CloudFormation模板创建参数组。
必须事先创建并用作输入变量(我们的模板上参数)。

第1步:创建数据库实例参数组

参数组允许我们管理数据库引擎配置。
要手动创建RDS数据库参数组,请按照以下步骤操作。

在AWS RDS控制台中选择参数组,然后单击"创建参数"组。

接下来,输入参数组详细信息。
对于我们的案例,我们正在创建一个MySQL版本8 DB实例,因此我们填写了以下详细信息。

完成后单击"创建"。
它将创建数据库参数组。

第2步:创建CloudFormation模板

使用以下模板创建RDS MySQL数据库实例。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Create a DB subnet group and MYSQL Database"
Parameters:
  VPC:
    Type: String
    Description: The VPC to create the cluster
    Default: vpc-ID
  PrivateSubnet01:
    Type: String
    Description: The subnet for the DB cluster
    Default: subnet-ID
  PrivateSubnet02:
    Type: String
    Description: The subnet for the DB cluster
    Default: subnet-ID
  MasterUsername:
    Type: String
    Description: The username for our database.
  
  MasterUserPassword:
    Type: String
    Description: The password for the database.
    "NoEcho": true
  ParameterGroup:
    Type: String
    Description: The name of the database parameter group created.
Resources:
    EC2SecurityGroup:
        Type: "AWS::EC2::SecurityGroup"
        Properties:
            GroupDescription: "Database instances security group"
            VpcId: !Ref VPC
            SecurityGroupIngress: 
              - 
                CidrIp: "*.*.*.*/32"
                FromPort: 3306
                IpProtocol: "tcp"
                ToPort: 3306
            SecurityGroupEgress: 
              - 
                CidrIp: "0.0.0.0/0"
                IpProtocol: "-1"
    RDSDBSubnetGroup:
        Type: "AWS::RDS::DBSubnetGroup"
        Properties:
            DBSubnetGroupDescription: "Subnet Group for mySQL database"
            DBSubnetGroupName: !Sub "${AWS::Region}-aws-dxl-database-subnet-group"
            SubnetIds: 
              - !Ref PrivateSubnet01
              - !Ref PrivateSubnet02
            Tags: 
              - Key: Name
                Value: eu-central-1-test-db-cluster
              - Key: createdBy
                Value: Maureen Barasa
              - Key: Project
                Value: test-blog
              - Key: Environment
                Value: test
    RDSDBInstance:
        Type: AWS::RDS::DBInstance
        Properties:
            DBInstanceIdentifier: aws-dxl-database-1
            AllocatedStorage: 100
            DBInstanceClass: db.m5.large
            Engine: "MYSQL"
            MasterUsername: !Ref MasterUsername
            MasterUserPassword: !Ref MasterUserPassword
            BackupRetentionPeriod: 7
            MultiAZ: true
            EngineVersion: 8.0.20
            AutoMinorVersionUpgrade: true
            Iops: 1000
            PubliclyAccessible: false
            StorageType: io1
            Port: 3306
            StorageEncrypted: true
            CopyTagsToSnapshot: true
            MonitoringInterval: 60
            EnableIAMDatabaseAuthentication: false
            EnablePerformanceInsights: true
            PerformanceInsightsRetentionPeriod: 7
            DeletionProtection: true
            DBSubnetGroupName: !Ref RDSDBSubnetGroup
            VPCSecurityGroups: 
              - !Ref EC2SecurityGroup
            MaxAllocatedStorage: 1000
            DBParameterGroupName: !Ref ParameterGroup
            MonitoringRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/rds-monitoring-role"
            Tags: 
              - Key: Name
                Value: aws-dxl-database-1
              - Key: createdBy
                Value: Maureen Barasa
              - Key: Project
                Value: test-blog
              - Key: Environment
                Value: test
Outputs:
   Cluster:
    Description: The DB Cluster Name
    Value: !Ref RDSDBInstance
    
   SubnetGroup:
    Description: The db subnet group name 
    Value: !Ref RDSDBSubnetGroup

我们可以使用CloudFormation Stack部署CloudFormation模板。

来源:https://docs.aws.amazon.com/awscloudformation/latest/userguide/cfn-whatis-howdoesitwork.html.

CloudFormation模板解释说明

模板包含3个部分。
参数,资源和输出部分。

参数:

在"资源"部分中,我们要求用户输入其模板的动态变量。
对于我们的情况,用户应使用各自的VPC和子网ID替换VPC和子网ID。
接下来,它将提示用户输入其数据库主用户名和密码。
最后,将需要用户输入前面创建的参数组的名称。

资源:

其中用户定义了要创建的AWS资源。
对于我们的情况,我们首先创建数据库实例安全组。
用户应该更改安全组入口以反映他们希望访问数据库实例的CIDR IP块。

接下来,它会创建DB子网组。
子网组定义了创建数据库群集和实例的子网。
此外,用户应注意根据需要自定义的名称和标记。

最后,创建数据库实例。
但是,用户应该通过模板并更改实例属性以匹配其特定需求。
此外,应自定义数据库实例标识符和标签以满足用户要求。

模板的输出部分指示CloudFormation输出所创建的资源的名称。
例如,在我们的情况下,我们指示模板输出数据库实例和子网组的名称。