我正在尝试为 Terraform 中的数据库连接设置 Cloudwatch 警报。
`resource "aws_cloudwatch_metric_alarm" "db_connections" {
alarm_name = "db_connections"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "1"
metric_name = "DatabaseConnections"
namespace = "AWS/RDS"
period = "300"
statistic = "Average"
threshold = var.db_connection_threshold
alarm_description = "Db connections"
alarm_actions = [aws_sns_topic.topic.arn]
dimensions = {
DBInstanceIdentifier = "${var.db_instance_id}"
}
}
`
我想要实现的是使用这个公式 GREATEST({log(DBInstanceClassMemory/805306368,2)*45},{log(DBInstanceClassMemory/8187281408,2)*1000}) 进行设置。如果大于 90%,则会发出警报。 Terraform 中有这种可能性吗?我尝试给出 var Threshold =formula/100 但它不起作用。有什么建议么?谢谢
不确定您是否必须使用该公式来创建数据库连接警报以及您使用的数据库引擎,但是,以下是我如何计算数据库的最大连接数并创建警报。
我在了解实例内存的情况下使用页面最大数据库连接数中的公式计算了最大数据库连接。例如,对于 MySQL:
{DBInstanceClassMemory/12582880}
要找到
DBInstanceClassMemory
,您必须将实例的内存从 GiB (Gibibytes) 转换为字节。
1 GiB = 1073741824 字节
实例类的内存量(以 GiB 为单位)可以在数据库实例类的硬件规格页面找到。所以,
db.t3.small
(MySQL)的最大连接数是:
(2 * 1073741824) / 12582880 ~= 170.66710
因此,实例最多可以有大约 170 个连接。知道这个数字后,您可以使用百分比轻松计算警报阈值。
我的 Terraform 模块看起来像这样:
...
variable "db_instance_name" {
type = string
nullable = false
}
variable "db_instance_class" {
type = string
nullable = false
}
variable "db_connections_limit_threshold" {
type = number
default = 80
description = "The maximum percent of connections connected to the DB instance. Default: 80"
}
locals {
datasets = {
# https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html#Concepts.DBInstanceClass.Summary
db_instance_classes_memory_gib = {
# db.t4g – burstable-performance instance classes with AWS Graviton2 processors
"db.t4g.2xlarge" : 32,
"db.t4g.xlarge" : 16,
"db.t4g.large" : 8,
"db.t4g.medium" : 4,
"db.t4g.small" : 2,
"db.t4g.micro" : 1,
# db.t3 – burstable-performance instance classes
"db.t3.2xlarge" : 32,
"db.t3.xlarge" : 4,
"db.t3.large" : 8,
"db.t3.medium" : 4,
"db.t3.small" : 2,
"db.t3.micro" : 1,
# db.t2 – burstable-performance instance classes
"db.t2.2xlarge" : 32,
"db.t2.xlarge" : 16,
"db.t2.large" : 8,
"db.t2.medium" : 4,
"db.t2.small" : 2,
"db.t2.micro" : 1
}
}
# https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections
# Max Connections: DBInstanceClassMemoryBytes/12582880
# db.t3.micro: 1 GiB (RDS Instance RAM) = 1073741824 bytes (DBInstanceClassMemoryBytes)
max_connections_limit = (local.datasets.db_instance_classes_memory_gib[var.db_instance_class] * 1073741824) / 12582880
db_connections_limit_threshold = floor((local.max_connections_limit / 100) * var.db_connections_limit_threshold)
}
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm
resource "aws_cloudwatch_metric_alarm" "db_connections_limit" {
alarm_name = "rds-${var.db_instance_name}-limitDBConnections"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "5"
metric_name = "DatabaseConnections"
namespace = "AWS/RDS"
period = "60"
statistic = "Average"
threshold = local.db_connections_limit_threshold
alarm_description = "Average database connections amount reached ${var.db_connections_limit_threshold} percent of the limit, may cause connection disruption"
alarm_actions = var.sns_topic_arns
ok_actions = var.sns_topic_arns
dimensions = {
DBInstanceIdentifier = var.db_instance_name
}
}
...
注意! 由于我找不到实例有关内存的硬件规格的来源,因此我将其硬编码到局部变量中
datasets
,因为此信息不太可能被更改。