Skip to main content
# Local variables for RDS instances
locals {
  rds_instances = {
    "AppName-prod-rds-db" = {
      db_instance_identifier = "AppName-prod-rds-db"
      engine                 = "postgres"
      instance_class         = "db.t4g.medium"
    }
    "AppNamedashboard-prod-vpc-rds" = {
      db_instance_identifier = "AppNamedashboard-prod-vpc-rds"
      engine                 = "mysql"
      instance_class         = "db.t4g.micro"
    }
    "customapp" = {
      db_instance_identifier = "customapp"
      engine                 = "mysql"
      instance_class         = "db.t4g.micro"
    }
    "AppName-prod-rds" = {
      db_instance_identifier = "AppName-prod-rds"
      engine                 = "mysql"
      instance_class         = "db.t4g.small"
    }
  }

  # CloudWatch alarm thresholds
  cpu_threshold             = 80         # CPU utilization percentage
  freeable_memory_threshold = 512000000  # 512 MB in bytes
  free_storage_threshold    = 5000000000 # 5 GB in bytes
}

# CloudWatch Alarm for CPU Utilization
resource "aws_cloudwatch_metric_alarm" "rds_cpu_utilization" {
  for_each = local.rds_instances

  alarm_name          = "CW-RDS-${each.value.db_instance_identifier}-CPUUtilization"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "2"
  metric_name         = "CPUUtilization"
  namespace           = "AWS/RDS"
  period              = "300" # 5 minutes
  statistic           = "Average"
  threshold           = local.cpu_threshold
  alarm_description   = "This metric monitors CPU utilization for ${each.value.db_instance_identifier}"
  alarm_actions       = [var.sns_topic_arn]
  treat_missing_data  = "notBreaching"

  dimensions = {
    DBInstanceIdentifier = each.value.db_instance_identifier
  }

  tags = {
    Name        = "CW-RDS-${each.value.db_instance_identifier}-CPUUtilization"
    Application = "CommonInfraResource"
    Environment = "Production"
    ManagedBy   = "Terraform"
  }
}

# CloudWatch Alarm for Freeable Memory (RAM)
resource "aws_cloudwatch_metric_alarm" "rds_freeable_memory" {
  for_each = local.rds_instances

  alarm_name          = "CW-RDS-${each.value.db_instance_identifier}-FreeableMemory"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = "2"
  metric_name         = "FreeableMemory"
  namespace           = "AWS/RDS"
  period              = "300" # 5 minutes
  statistic           = "Average"
  threshold           = local.freeable_memory_threshold
  alarm_description   = "This metric monitors freeable memory for ${each.value.db_instance_identifier}"
  alarm_actions       = [var.sns_topic_arn]
  treat_missing_data  = "notBreaching"

  dimensions = {
    DBInstanceIdentifier = each.value.db_instance_identifier
  }

  tags = {
    Name        = "CW-RDS-${each.value.db_instance_identifier}-FreeableMemory"
    Application = "CommonInfraResource"
    Environment = "Production"
    ManagedBy   = "Terraform"
  }
}

# CloudWatch Alarm for Free Storage Space (Disk)
resource "aws_cloudwatch_metric_alarm" "rds_free_storage_space" {
  for_each = local.rds_instances

  alarm_name          = "CW-RDS-${each.value.db_instance_identifier}-FreeStorageSpace"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = "2"
  metric_name         = "FreeStorageSpace"
  namespace           = "AWS/RDS"
  period              = "300" # 5 minutes
  statistic           = "Average"
  threshold           = local.free_storage_threshold
  alarm_description   = "This metric monitors free storage space for ${each.value.db_instance_identifier}"
  alarm_actions       = [var.sns_topic_arn]
  treat_missing_data  = "notBreaching"

  dimensions = {
    DBInstanceIdentifier = each.value.db_instance_identifier
  }

  tags = {
    Name        = "CW-RDS-${each.value.db_instance_identifier}-FreeStorageSpace"
    Application = "CommonInfraResource"
    Environment = "Production"
    ManagedBy   = "Terraform"
  }
}

# CloudWatch Alarm for Database Connections
resource "aws_cloudwatch_metric_alarm" "rds_database_connections" {
  for_each = local.rds_instances

  alarm_name          = "CW-RDS-${each.value.db_instance_identifier}-DatabaseConnections"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "2"
  metric_name         = "DatabaseConnections"
  namespace           = "AWS/RDS"
  period              = "300" # 5 minutes
  statistic           = "Average"
  threshold           = 80 # Adjust based on your instance max connections
  alarm_description   = "This metric monitors database connections for ${each.value.db_instance_identifier}"
  alarm_actions       = [var.sns_topic_arn]
  treat_missing_data  = "notBreaching"

  dimensions = {
    DBInstanceIdentifier = each.value.db_instance_identifier
  }

  tags = {
    Name        = "CW-RDS-${each.value.db_instance_identifier}-DatabaseConnections"
    Application = "CommonInfraResource"
    Environment = "Production"
    ManagedBy   = "Terraform"
  }
}