Table of Contents
#Introduction
In this tutorial, How to deploy cluster web servers in Auto Scaling Group with ELB use Terraform.
What does Elastic Load Balancer mean?
Elastic Load Balancer allows balancing the load across the nodes ASG cluster.ELB also helps to manage SSL cert if your project requires HTTPS access.
Three types of ELB: Classic Load Balancer, Network Load Balancer, and Application Load Balancer.
Auto Scaling Group: allow us to scale up and scaling down the resources based on usage.
Auto Scaling Policy: the key feature of Auto Scaling Group is to scale up or scale down resources based on Auto Scaling Policy we attach.
- AWS auto scaling Group: Min = 2, Max = 10 and desired_capacity =3
- User user_data and create a script to install Nginx webserver on amazon linux 2.
- Auto Scaling Group: Scaling Policy – Target Tracking policy
- Security group ingress rule to allow access web server from my laptop ? and ELB security group.
- Elastic load balancer
- Elastic load balancer security group: ingress rule to allow access web server from my laptop ?
Structure folder and files
Created Cluster_WebServer_ASG_ELB folder contains files as below:
asg_config.tf
auto_scale_group.tf
output.tf
provider.tf
securitygroups.tf
variables.tf
elastic_load_balancer.tf
elb_security_group.tf
On AWS
we created key pair terraform-demo as the picture below
Deploy cluster web servers in ASG with ELB
Create a new file asg_config.tf with the content as below
resource aws_launch_configuration "my_config" {
image_id = var.ami
instance_type = var.instance_type
security_groups=["${aws_security_group.web_sg.id}"]
key_name = "terraform-demo"
user_data = <<EOF
#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
sudo yum update -y
sudo amazon-linux-extras install nginx1 -y
sudo su -c "/bin/echo 'My Site: DevopsRoles.com' >/usr/share/nginx/html/index.html"
instance_ip=`curl http://169.254.169.254/latest/meta-data/local-ipv4`
sudo su -c "echo $instance_ip >>/usr/share/nginx/html/index.html"
sudo systemctl start nginx
sudo systemctl enable nginx
EOF
lifecycle {
create_before_destroy = true
}
}
Create a new file auto_scale_group.tf with the content as below
resource "aws_autoscaling_group" "first_asg" {
launch_configuration = aws_launch_configuration.my_config.id
availability_zones = "${var.azs}"
min_size = 2
max_size = 10
desired_capacity = 3
tag {
key = "Name"
value = "terraform-asg"
propagate_at_launch = true
}
}
New file elastic_load_balancer.tf with the content as below
resource "aws_elb" "first_elb" {
name = "terraform-elb"
availability_zones = var.azs
security_groups=[ aws_security_group.elb_sg.id ]
listener {
lb_port=80
lb_protocol ="http"
instance_port = var.server_port
instance_protocol= "http"
}
health_check {
healthy_threshold = 2
unhealthy_threshold = 2
timeout=3
interval = 30
target = "HTTP:${var.server_port}/"
}
}
Create a new file elb_security_group.tf with the content as below
resource "aws_security_group" "elb_sg" {
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = [ var.my_public_ip ]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Create a new file output.tf with the content as below
output "elb_endpoint" {
value = [ "${aws_elb.first_elb.arn}"]
}
provider.tf file
provider "aws" {
region = var.region
}
securitygroups.tf file
resource "aws_security_group" "web_sg" {
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = [ var.my_public_ip ]
}
ingress {
from_port = var.ssh_port
to_port = var.ssh_port
protocol = "tcp"
cidr_blocks = [ var.my_public_ip ]
}
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
security_groups = [ aws_security_group.elb_sg.id ]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
variables.tf file
variable "region" {
description = " Define the AWS region "
default = "us-west-2"
}
variable "server_port" {
description = "http service listen"
default = "80"
}
variable "ssh_port" {
description = "ssh to server"
default = "22"
}
variable "instance_type" {
description = "AWS ec2 instance type"
default="t2.micro"
}
variable "my_public_ip" {
description = "My laptop public IP ..."
default = "116.110.26.150/32"
}
variable "ami" {
description = "amazon machine image"
default = "ami-0c2d06d50ce30b442"
}
variable "azs" {
default = [ "us-west-2a", "us-west-2b", "us-west-2c" ]
}
First, we run below to initialize, download the plugins and validate the terraform syntax…
terraform init
terraform validate
Applying a template
$ terraform apply
Conclusion
You have to deploy cluster web servers in ASG with ELB use Terraform. I hope will this your helpful. Thank you for reading the DevopsRoles page!