Gebruik Cloudformation om een RDS MySql Instance op AWS te maken

De AWS Relational Database Service (RDS AWS) is een webdienst die het gemakkelijker maakt om een relationele databank in de cloud op te zetten & te beheren. Om meer te begrijpen over RDS zoek je naar het artikel“How to setup an RDS MySql (Relation Database MySql ) instance on AWS“.

Met AWS CloudFormation kunnen we programmeertalen (yaml/json) of een eenvoudig tekstbestand gebruiken om alle middelen die we voor onze toepassingen nodig hebben te modelleren en te provisionen. Dit geeft ons een enkele bron van waarheid voor onze AWS bronnen.

In dit artikel zien we de stappen om een RDS MySql Instance te maken met behulp van Cloudformation Stack.

Pre-requisites

  1. AWS Account (Maak aan als je er geen hebt).
  2. Basiskennis van Cloudformation Stack.
  3. Basiskennis vanRDS MySql (Relation Database MySql ) instance op AWS.

Wat zullen we doen?

  1. Log in op AWS.
  2. Maak een RDS MySql Instance met behulp van Cloudformation Stack

Login op AWS

  1. Klik op hier om naar de AWS Login pagina te gaan.

Als we op de bovenstaande link klikken, zien we een webpagina als volgt waar we moeten inloggen met onze inloggegevens.

Log in op AWS

Zodra we met succes op AWS zijn ingelogd, zien we de hoofdconsole met alle genoemde diensten.

AWS Beheerconsole

Maak een RDS MySql Instance met Cloudformation.

Voor we een instance maken met Cloudformation Stack, kopieer je de code uit het volgende blok of download je het sjabloon vanhier en sla je het op je lokale machine op.

---
AWSTemplateFormatVersion: '2010-09-09'
Description: This stack creates an RDS MySql 5.7 Instance
Parameters:
  Owner:
    Description: Enter the Name of the owner for this Stack.
    Type: String
    Default: Name
  VPC:
    Description: Select VPC form the available VPCs in your account.
    Type: AWS::EC2::VPC::Id
  PrivateSubnet1:
    Description: Select Private Subnet 1.
    Type: AWS::EC2::Subnet::Id
  PrivateSubnet2:
    Description: Select Private Subnet 2.
    Type: AWS::EC2::Subnet::Id
  PrivateSubnet3:
    Description: Select Private Subnet 3.
    Type: AWS::EC2::Subnet::Id
  MasterUsername:
    Description: Database administration name.
    Type: String
    Default: rdsroot
  MasterUserPassword:
    NoEcho: 'true'
    Description: Database administration password.
    Type: String
    MinLength: '8'
    AllowedPattern: "[a-zA-Z0-9!?]*"
    ConstraintDescription: Must only contain upper and lowercase letters and numbers
  BackupRetentionPeriod:
    Description: Enter Backup Retention Period in Days.
    Type: Number
    Default: '5'
  MultiAvailabilityZone:
    Description: Do you want to Enable Multi Availability Zones?
    Type: String
    Default: 'true'
    AllowedValues:
    - 'true'
    - 'false'
  TcpPort:
    Description: Enter RDS Listening TCP Port number.
    Type: Number
    Default: '3306'
  PreferredBackupWindow:
    Description: Enter Preferred Backup Window Time.
    Type: String
    Default: 15:00-17:00
  PreferredMaintenanceWindow:
    Description: Enter Preferred Maintenance Window Time.
    Type: String
    Default: Sun:18:00-Sun:22:00
  AllocatedStorage:
    Default: '15'
    Description: Enter the size of the database (Gb)
    Type: Number
    MinValue: '5'
    MaxValue: '6144'
    ConstraintDescription: Must be between 5-6144
  SnapshotOnDelete:
    Description: Do you want to create a Snapshot on instance delete?
    Type: String
    Default: 'true'
    AllowedValues:
    - 'true'
    - 'false'
  AutoMinorVersionUpgrade:
    Description: Do you want to allow automatic minor version upgrade?
    Type: String
    Default: 'true'
    AllowedValues:
    - 'true'
    - 'false'
  InstanceType:
    Description: Select Instance Type.
    Type: String
    Default: db.t2.micro
    ConstraintDescription: Must be a valid EC2 instance type.
Mappings:
  Settings:
    MySQL:
      Engine: MySQL
      Version: '5.7'
Conditions:
  ConfigureSnapshotOnDelete:
    Fn::Equals:
    - Ref: SnapshotOnDelete
    - 'true'

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
    - Label:
        default: Ownership
      Parameters:
      - Owner
    - Label:
        default: Network Configuration
      Parameters:
      - VPC
      - PrivateSubnet1
      - PrivateSubnet2
      - PrivateSubnet3
    - Label:
        default: RDS Configuration
      Parameters:
      - InstanceType
      - MasterUsername
      - MasterUserPassword
      - BackupRetentionPeriod
      - PreferredBackupWindow
      - PreferredMaintenanceWindow
      - SnapshotOnDelete
      - AllocatedStorage
      - AutoMinorVersionUpgrade
      - TcpPort
      - MultiAvailabilityZone
    ParameterLabels:
      Owner:
        default: Team or Individual Owner
      InstanceType:
        default: Instance Type
      PrivateSubnet1:
        default: Private Subnet 1
      PrivateSubnet2:
        default: Private Subnet 2
      PrivateSubnet3:
        default: Private Subnet 3
      MasterUsername:
        default: Master Username
      MasterUserPassword:
        default: Master User Password
      BackupRetentionPeriod:
        default: Backup Retention Period
      PreferredBackupWindow:
        default: Preferred Backup Window
      PreferredMaintenanceWindow:
        default: Preferred Maintenance Window
      AllocatedStorage:
        default: Allocated Storage
      AutoMinorVersionUpgrade:
        default: Auto Minor Version Upgrade
      TcpPort:
        default: TCP Port
      MultiAvailabilityZone:
        default: Multi Availability Zone?
      SnapshotOnDelete:
        default: Snapshot On Delete?

Resources:
  RDSAccessSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Instance to RDS Access
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value:
          Fn::Join:
          - ''
          - - Ref: AWS::StackName
            - "-rds"
      - Key: Owner
        Value:
          Ref: Owner
  AccessSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    DependsOn: RDSAccessSecurityGroup
    Properties:
      GroupId:
        Ref: RDSAccessSecurityGroup
      IpProtocol: tcp
      FromPort:
        Ref: TcpPort
      ToPort:
        Ref: TcpPort
      SourceSecurityGroupId:
        Ref: RDSAccessSecurityGroup
  DbSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription:
        Fn::Join:
        - ''
        - - 'RDS Subnet Group for '
          - Ref: AWS::StackName
      SubnetIds:
      - Ref: PrivateSubnet1
      - Ref: PrivateSubnet2
      - Ref: PrivateSubnet3
      Tags:
      - Key: Name
        Value:
          Ref: AWS::StackName
      - Key: Owner
        Value:
          Ref: Owner
  DbInstance:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Snapshot
    DependsOn:
    - DbSubnetGroup
    - RDSAccessSecurityGroup
    Properties:
      AllocatedStorage:
        Ref: AllocatedStorage
      AllowMajorVersionUpgrade: 'false'
      AutoMinorVersionUpgrade:
        Ref: AutoMinorVersionUpgrade
      BackupRetentionPeriod:
        Ref: BackupRetentionPeriod
      DBInstanceClass:
        Ref: InstanceType
      DBInstanceIdentifier:
        Ref: AWS::StackName
      DBSubnetGroupName:
        Ref: DbSubnetGroup
      Engine:
        Fn::FindInMap:
        - Settings
        - MySQL
        - Engine
      EngineVersion:
        Fn::FindInMap:
        - Settings
        - MySQL
        - Version
      MasterUsername:
        Ref: MasterUsername
      MasterUserPassword:
        Ref: MasterUserPassword
      MultiAZ:
        Ref: MultiAvailabilityZone
      Port:
        Ref: TcpPort
      PreferredBackupWindow:
        Ref: PreferredBackupWindow
      PreferredMaintenanceWindow:
        Ref: PreferredMaintenanceWindow
      PubliclyAccessible: 'false'
      StorageEncrypted: 'false'
      StorageType: gp2
      VPCSecurityGroups:
      - Ref: RDSAccessSecurityGroup
      Tags:
      - Key: Name
        Value:
          Ref: AWS::StackName
      - Key: Owner
        Value:
          Ref: Owner

Outputs:
  Owner:
    Description: Team or Individual that Owns this Formation.
    Value:
      Ref: Owner
  VPC:
    Description: VPC Used
    Value:
      Ref: VPC
  RDSHostname:
    Description: RDS Hostname
    Value:
      Fn::GetAtt:
      - DbInstance
      - Endpoint.Address
  RDSPort:
    Description: RDS Port
    Value:
      Fn::GetAtt:
      - DbInstance
      - Endpoint.Port
  DbSubnetGroup:
    Description: DB Subnet Group Created.
    Value:
      Ref: DbSubnetGroup
  RDSAccessSecurityGroup:
    Description: RDS Access Security Group Created.
    Value:
      Ref: RDSAccessSecurityGroup
  PrivateSubnet1:
    Description: Private Subnet 1 Deployment
    Value:
      Ref: PrivateSubnet1
  PrivateSubnet2:
    Description: Private Subnet 2 Deployment
    Value:
      Ref: PrivateSubnet2
  PrivateSubnet3:
    Description: Private Subnet 3 Deployment
    Value:
      Ref: PrivateSubnet3
  BackupRetentionPeriod:
    Description: Backup Retention Period in Days
    Value:
      Ref: BackupRetentionPeriod
  MultiAvailabilityZone:
    Description: Enable Multi Availability Zones?
    Value:
      Ref: MultiAvailabilityZone
  SnapshotOnDelete:
    Description: Create Snapshot on Delete?
    Value:
      Ref: SnapshotOnDelete
  PreferredBackupWindow:
    Description: Preferred Backup Window
    Value:
      Ref: PreferredBackupWindow
  PreferredMaintenanceWindow:
    Description: Preferred Maintenance Window
    Value:
      Ref: PreferredMaintenanceWindow
  AllocatedStorage:
    Description: Allocated Storage in GB
    Value:
      Ref: AllocatedStorage

Als je het sjabloon bij je hebt op je lokale machine, ga dan naar de AWS console en klik op “Services” in de bovenste menubalk en zoek naar “Cloudformation”.

Cloudformation

Je ziet het hoofddashboard van Cloudformation als volgt. Klik op de knop “Create Stack” om een stack te maken om een RDS MySql Instance te maken.

Stapels

Klik op het keuzerondje “Upload a template file” en kies het sjabloon dat je van je lokale machine hebt opgeslagen en klik op de knop “Next”.

Maak Cloudformation Stack

Geef een naam naar keuze aan de stack en vul de vereiste gegevens in en klik op “Next” om verder te gaan.

Geef details over de stapel

Hoofdgebruikerswachtwoord

Je kunt de tags aan Cloudformation Stack geven die toegepast kunnen worden op de RDS MySql Instance die door de stack aangemaakt zal worden. Klik op “Next” om verder te gaan.

Tags

Scroll naar beneden en klik op “Create stack” om de stack aan te maken.

Maak Stapel

Het aanmaken duurt enige tijd. Je kunt de actie die ondernomen wordt zien onder events.

RDS MySQL

Om de status te zien van de RDS MySql instantie die gemaakt wordt, klik je op “Services” en zoek je naar “RDS”.

RDS

Op het hoofddashboard klik je op “DB Instances”.

Maak databank

Hier zie je dat de status van de instantie “Modifying” is. Het zal even duren voor deze is aangemaakt en klaar is voor gebruik.

RDS Database lijst

In de Cloudformation Stack gebeurtenissen zie je dat na enige tijd, als de RDS MySql Instance eenmaal gemaakt is, de status “CREATE_COMPLETE” is.

RDS actielogboek

In de RDS Console zie je nu dat de status “Available” is.

MySQL Database op AWS

Om meer details over de RDS MySql Instance te zien, klik je op de RDS MySql Instance –> Connectivity & Security.

Om verbinding te maken met de RDS MySql Instance kun je het eindpunt gebruiken dat door de instance wordt verschaft.

Gegevensbestand

Als de instantie niet meer nodig is, verwijder je de Cloudformation Stack uit het Cloudformation Main Dashboard om op de kosten te besparen.

Conclusie

In dit artikel zagen we de stappen om een RDS MySql instance te maken met Cloudformation Stack.