2017-09-21 27 views
0

10个报警单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”变量(或迭代列表)将导致维护噩梦。

回答

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才能完全应用这样的更改。