Copy
# 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"
}
}
