Building a Cloud Watch Dashboard for Load Balancers: A Terragrunt Approach

Introduction :-

Amazon CloudWatch Dashboard is a web-based service that allows users to monitor and visualize their AWS resources and applications in real-time.In this guide, we will walk you through the process of creating a CloudWatch dashboard specifically for monitoring your AWS Elastic Load Balancer (ELB) using Terraform. By leveraging the power of Terraform’s infrastructure-as-code approach, you can automate the creation and management of your CloudWatch dashboard, making it easier to maintain consistency and scalability across your infrastructure

Pre-Requestisites:-

  • An AWS account with appropriate permissions to create CloudWatch dashboards.

  • Terraform and Terragrunt should be installed on your local machine.

  • AWS credentials properly configured.

Process :-

Step1: First we need to define the Terraform resources. For that create a directory/folder with name lb_dashboard_terraform. Under the folder create terraform configuration files such as main.tf , variables.tf & outputs.tf.

#main.tf
resource "aws_cloudwatch_dashboard" "main" {
  dashboard_name = var.dashboard_name
  dashboard_body = jsonencode({
    widgets = [
      {
         type = "metric",
         x = 0,
         y = 6,
         width = 12,
         height = 6,
         properties = {
           metrics = [            
            [
             "AWS/ApplicationELB",
             "UnhealthyStateRouting",
             "Load Balancer",
             "${var.load_balancer_arn}",
             "Target Group",
             "${var.target_group_arn}",
             {
               region  = "us-west-2",
             },
          ],
          [
           "...",
            "Load Balancer",
            "${var.load_balancer_arn}",
            "Target Group",
            "${var.target_group_arn}",
          ],
          ]
           period = 300,
           stat = "Sum",
           stacked = false
           view    = "timeSeries" 
           region = "${var.region}"
           title = "Unhealthy State Routing"   
        }
      },
      {       
      type = "metric",
         x = 12,
         y = 12,
         width = 12,
         height = 6,
         properties = {
           metrics = [        
              [
              "AWS/ApplicationELB",
              "ProcessedBytes",
              "LoadBalancer",
              "${var.load_balancer_arn}",
              {
                region = "us-west-2",
              },
              ]
          ],
           period = 300,
           stat = "Average",
           stacked = false
           view    = "timeSeries" 
           region = "${var.region}"
           title = "ProcessedBytes"
        }
      }
    ]
  })
 }


resource "aws_cloudwatch_metric_alarm" "metrics" {
  alarm_name            = var.alarm_name
  comparison_operator   = "GreaterThanOrEqualToThreshold"
  evaluation_periods    = "2"
  metric_name           = "RequestCountPerTarget"
  namespace             = "AWS/ApplicationELB"
  period                = "120"
  statistic             = "Sum"
  threshold             = "20"
  alarm_description     = "This metric monitors load balancer requests exceeding 100 per minute"
  dimensions = {
    LoadBalancer = "${var.load_balancer_arn}"
    TargetGroup  = "${var.target_group_arn}"
  }
  insufficient_data_actions = []
  alarm_actions     = var.alarm_actions
}

step 2: Define the terraform variables for the main.tf file in a file named variables.tf.

#variables.tf
variable "load_balancer_arn" {
  type        = string
  description = "ARN of the load balancer to monitor"
}

variable "target_group_arn" {
  type        = string
  description = "ARN of the target group to monitor"
}

variable "dashboard_name" {
  type        = string
  description = "Name of the CloudWatch dashboard"
}

variable "alarm_name" {
  type        = string
  description = "Name of the CloudWatch alarm"
}

variable "region" {
  type        = string
  description = "AWS region"
}

variable "alarm_actions" {
  type        = set(string)
  description = "Alarm Actions"
  default     = []
}

Step 3:- create one more directory named lb_dashboard_terragrunt and create a file named terragrunt.hcl. Next define the terragrunt code in that file as shown below.

terraform {
  source = "../lb_dashboard_terraform"
}

include "root" {
  path = find_in_parent_folders()
}

inputs = {
  dashboard_name   = "loadbalancer-dashboard"
  target_group_arn  = "Target Group Suffix arn"
  load_balancer_arn = "Load Balancer Suffix arn"
  region            = "us-west-2"
  alarm_name        = "loadbalancer-monitoring"
}

Step 4: Pass your load balancer arn and target group arn values in the place of Target Group Suffix arn and Load Balancer Suffix arn.

Step 5: Apply your changes Once you’ve defined your Terraform resources and Terragrunt configuration, you can apply your changes with the following commands

terragrunt init
terragrunt plan
terragrunt apply

Note: make sure you navigate to the terragrunt file created folder and perform these commands

Conclusion :-

That’s it! You’ve created a CloudWatch dashboard for monitoring a load balancer and target group using Terraform and Terragrunt. You can customize this code to monitor other metrics or add additional resources to your infrastructure.

0
Subscribe to my newsletter

Read articles from Mahira Technology Private Limited directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Mahira Technology Private Limited
Mahira Technology Private Limited

A leading tech consulting firm specializing in innovative solutions. Experts in cloud, DevOps, automation, data analytics & more. Trusted technology partner.