在Terraform中,如何轻松地为每个表创建10个警报

时间:2017-09-21 18:47:26

标签: amazon-dynamodb terraform

单个terraform警报看起来像这样:

resource "aws_cloudwatch_metric_alarm" "ecs_cpu_reservation" {
    alarm_name          = "ecs-cpu-reservation-${var.environment}"
    alarm_description   = "my description"
    namespace           = "AWS/ECS"
    metric_name         = "CPUReservation"
    dimensions {
      ClusterName = "${var.environment}"
    }
    statistic           = "Average"
    period              = "300"
    evaluation_periods  = "${var.acceptable_cpu_reservation_eval_period}"
    comparison_operator = "GreaterThanOrEqualToThreshold"
    threshold           = "${var.acceptable_cpu_reservation}"
    alarm_actions       = ["${data.terraform_remote_state.vpc.my_topic_arn}"]
    actions_enabled     = "${var.alerting_enabled}"
}

每张桌子有10个闹钟,还有50张桌子。 因此,tf文件将包含500个这些资源块。那是个大文件!

绝大多数警报都是相同的...唯一的区别是警报的表格。

有没有办法循环表名列表并创建警报?

根据我的阅读,使用“count”变量(或迭代列表)将导致维护噩梦。

1 个答案:

答案 0 :(得分:0)

避免循环的另一个选择是用模块包装东西,这样你只需要获取一次就可以获得模块中的所有内容。

所以如果你有一个看起来像这样的模块:

variable "dynamodb_table_name" {}
variable "consumed_read_units_threshold" {}
variable "consumed_write_units_threshold" {}
...

resource "aws_cloudwatch_metric_alarm" "consumed_read_units" {
  alarm_name                = "dynamodb_${var.dynamodb_table_name}_consumed_read_units"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "2"
  metric_name               = "ConsumedReadCapacityUnits"
  namespace                 = "AWS/DynamoDB"
  period                    = "120"
  statistic                 = "Average"
  dimensions {
    TableName = "${var.dynamodb_table_name}"
  }
  threshold                 = "${var.consumed_read_units_threshold}"
  alarm_description         = "This metric monitors DynamoDB ConsumedReadCapacityUnits for ${var.dynamodb_table_name}"
  insufficient_data_actions = []
}


resource "aws_cloudwatch_metric_alarm" "consumed_write_units" {
  alarm_name                = "dynamodb_${var.dynamodb_table_name}_consumed_write_units"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "2"
  metric_name               = "ConsumedWriteCapacityUnits"
  namespace                 = "AWS/DynamoDB"
  period                    = "120"
  statistic                 = "Average"
  dimensions {
    TableName = "${var.dynamodb_table_name}"
  }
  threshold                 = "${var.consumed_write_units_threshold}"
  alarm_description         = "This metric monitors DynamoDB ConsumedWriteCapacityUnits for ${var.dynamodb_table_name}"
  insufficient_data_actions = []
}

...

您可以在一个位置定义所有DynamoDB表指标,然后在创建DynamoDB表时获取该指标,并且它们都会为您关注的每件事获取指标警报。然后,可以在一个地方(模块)轻松添加/删除/修改这些警报,并在下一个terraform apply上自动应用于您的表格。

理想情况下,您可以创建一个同时创建表格和警报的DynamoDB模块,但DynamoDB table resource并不是特别灵活,所以这将是一场噩梦设计一个模块,允许您需要的灵活性(主要是不同的定义属性和索引)。

如果你想要你可以将它与循环相结合以减少一些模块代码以换取更改循环事物的问题,因为Terraform将看到事物变化的资源并强制重新创建甚至不应该是的东西影响。如果您只是创建警报(没有任何状态或需要100%增加),这不是一个很大的问题,但请注意,可能需要第二个terraform apply来完全应用这样的更改。