DEV Community

Revathi Joshi for AWS Community Builders

Posted on

How to launch an RDS Cluster with Multi AZ Read Replica using Terraform

What is Terraform?

  • HashiCorp Terraform is an infrastructure as code (IaC) tool that lets you define both cloud and on-prem resources in human-readable configuration files that you can version, reuse, and share.

Please visit my GitHub Repository for RDS articles on various topics being updated on constant basis.

Please visit my GitHub Repository for Terraform articles on various topics being updated on constant basis.

Let’s get started!

Objectives:

1. Sign into AWS Management Console.

2. Create the organizational structure

3. Under RDS_files directory:
Create 4 files - variables.tf, terraform.tfvars, main.tf, outputs.tf

4. Initialize Terraform

5. Generate the action plans

6. Create all the resources declared in main.tf configuration file

7. Validate all resources created in the AWS Console

8. Execute Database Operations via SSH

Pre-requisites:

  • AWS user account with admin access, not a root account.
  • Cloud9 IDE with AWS CLI.

Resources Used:

Terraform documentation

What is Amazon Relational Database Service (Amazon RDS)?

Steps for implementation to this project:

1. Sign into AWS Management Console.

  • Make sure you're in the N. Virginia (us-east-1) region

2. Let’s create the following organizational structure as shown below.

3. Under RDS-files directory:

Create 4 files - variables.tf, terraform.tfvars, main.tf, outputs.tf

  • 1. variables.tf - to declare all the global variables with a short description and a default value.
variable "access_key" {
    description = "Access key to AWS console"
}
variable "secret_key" {
    description = "Secret key to AWS console"
}
variable "region" {
    description = "AWS region"
}
Enter fullscreen mode Exit fullscreen mode
  • 2. terraform.tfvars - Replace the values of access_key and secret_key by copying your AWS Access Key ID and Secret Access Key ID.
region = "us-east-1"
access_key = "<YOUR AWS CONSOLE ACCESS ID>"
secret_key = "<YOUR AWS CONSOLE SECRET KEY>"
Enter fullscreen mode Exit fullscreen mode
  • 3. main.tf - Creating a EC2, RDS and its components
  • define the provider as aws
  • Create a Security group and key pair for EC2 in main.tf file
  • Create an EC2 Instance
  • Create a Security group for RDS
  • Create RDS Database DB Cluster and Instance # an Amazon Aurora database with Multi-AZ enabled # Creating Amazon Aurora Cluster
# define the provider as aws
provider "aws" {
    region     = "${var.region}"
    access_key = "${var.access_key}"
    secret_key = "${var.secret_key}"            
}

# Create a Security group and key pair for EC2
# Creating Security Group for EC2 
resource "aws_security_group" "web-server" {
    name        = "MyEC2server-SG"
    description = "Security for EC2 server to connect with RDS"
    ingress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]     
    }
    egress {
        from_port   = 0
        to_port     = 0
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]     
    }           
}

# Creating Key pair for EC2 
resource "tls_private_key" "example" {
  algorithm = "RSA"
  rsa_bits  = 4096          
}

resource "aws_key_pair" "rev_key" {
  key_name   = "RevKey"
  public_key = tls_private_key.example.public_key_openssh           
} 

# Launch an EC2 Instance
resource "aws_instance" "web-server" {
    ami             = "ami-00c6177f250e07ec1"
    instance_type   = "t2.micro"
    key_name        = aws_key_pair.rev_key.key_name
    security_groups = ["${aws_security_group.web-server.name}"]
    user_data = <<-EOF
#!/bin/bash -ex 
yum install mysql -y    
    EOF
    tags = {
        Name = "MyRDSEC2server"     
    }           
}

# Create a Security group for RDS
resource "aws_security_group" "rds-server" {
    name        = "RDS-AZ-SG"
    description = "Security group for RDS Aurora"
    ingress {
        from_port   = 3306
        to_port     = 3306
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]     
    }
    egress {
        from_port   = 0
        to_port     = 0
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]     
    }           
}

# Create RDS Database DB Cluster and Instance
# an Amazon Aurora database with Multi-AZ enabled
# Creating Amazon Aurora Cluster 
resource "aws_rds_cluster" "aurorards" {
  cluster_identifier      = "myauroracluster"
  engine                  = "aurora-mysql"
  database_name           = "MyDB"
  master_username         = "Admin"
  availability_zones = ["us-east-1a", "us-east-1b", "us-east-1c"]
  master_password         = "Admin123"
  vpc_security_group_ids = [aws_security_group.rds-server.id]
  storage_encrypted = false
  skip_final_snapshot   = true          
}
# Launching Amazon Aurora DB Instance 
resource "aws_rds_cluster_instance" "cluster_instances" {
  count = 2
  identifier         = "muaurorainstance${count.index}"
  cluster_identifier = aws_rds_cluster.aurorards.id
  publicly_accessible = true
  instance_class     = "db.t3.small"
  engine             = aws_rds_cluster.aurorards.engine
  engine_version =      aws_rds_cluster.aurorards.engine_version            
}
Enter fullscreen mode Exit fullscreen mode
  • 4. output.tf - displays the output as EC2 instance ID and aurorards endpoint.
output "instance_id" {
  description = "ID of the EC2 instance"
  value       = aws_instance.web-server.id          
}
output "cluster_endpoint" {
  value       = aws_rds_cluster.aurorards.endpoint          
}
Enter fullscreen mode Exit fullscreen mode

4. Initialize Terraform

cd RDS-files

terraform version
Enter fullscreen mode Exit fullscreen mode

Image description

  • terraform init will check for all the plugin dependencies and download them if required, this will be used for creating a deployment plan.
terraform init
Enter fullscreen mode Exit fullscreen mode

Image description

5. To generate the action plans, run the below command:

terraform plan
Enter fullscreen mode Exit fullscreen mode

Image description

6. Create all the resources declared in main.tf configuration file

terraform apply
Enter fullscreen mode Exit fullscreen mode
  • takes up to 15-20 minutes to create all the resources

Image description

7. Validate all resources created in the AWS Console

  • Aurora Cluster in Multi-zone

Image description

  • Click on the RDS cluster/Connectivity & security to find the endpoint of your Master(Writer) and Reader instances, with which you can connect to your DB instance.

Image description

  • Copy the Endpoints for later use
# Master(Writer) endpoint 
myauroracluster.cluster-cgizjtuyxkda.us-east-1.rds.amazonaws.com

# Reader instance endpoint
myauroracluster.cluster-ro-cgizjtuyxkda.us-east-1.rds.amazonaws.com
Enter fullscreen mode Exit fullscreen mode

8. Execute Database Operations via SSH

  • select the MyRDSEC2server, Click on Connect button to SSH into the EC2 instance

Image description

Image description

  • Switch to the root user
sudo -su
Enter fullscreen mode Exit fullscreen mode

Image description

  • Log into the RDS instance
# mysql -h <Hostname> -u <username> -p
# mysql -h <Master(Writer)Cluster endpoint> -u <Username>
# -p Admin123

mysql -h myauroracluster.cluster-cgizjtuyxkda.us-east-1.rds.amazonaws.com -u Admin -p
Enter fullscreen mode Exit fullscreen mode

Image description

  • List all Databases
Show databases;
Enter fullscreen mode Exit fullscreen mode

Image description

  • Create database rev_aurora_db
Create database rev_aurora_db;
Enter fullscreen mode Exit fullscreen mode

Image description

  • Select the newly-created database
use rev_aurora_db;
Enter fullscreen mode Exit fullscreen mode

Image description

  • create a table named students and insert few rows of data
CREATE TABLE students       
  (
     subject_id   INT auto_increment,
     subject_name VARCHAR(255) NOT NULL,
     teacher      VARCHAR(255),
     start_date   DATE,
     lesson       TEXT,
     PRIMARY KEY (subject_id)       
  );
Enter fullscreen mode Exit fullscreen mode

Image description

  • Insert data into the table
INSERT INTO students(subject_name, teacher) VALUES ('Science', 'Sav');

INSERT INTO students(subject_name, teacher) VALUES ('Hindi', 'Nita');

INSERT INTO students(subject_name, teacher) VALUES ('Maths', 'Prabha');

INSERT INTO students(subject_name, teacher) VALUES ('Arts', 'Manju');
Enter fullscreen mode Exit fullscreen mode

Image description

  • select the contents of the table students
select * from students;
Enter fullscreen mode Exit fullscreen mode

Image description

  • Exit from mysql
exit
Enter fullscreen mode Exit fullscreen mode

Image description

Cleanup

terraform destroy
Enter fullscreen mode Exit fullscreen mode

Image description

What we have done so far

  • Using Terraform, we have successfully launched an EC2 Instance, created an Amazon Aurora MySQL database with Multi-Az enabled and executed Database operations via ssh.

Top comments (0)