在Terraform,你怎么能轻松地创建每桌
问题描述:
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”变量(或迭代列表)将导致维护噩梦。
答
避免循环的另外一个选择是用一个模块来包装东西,所以你只需要一次获取模块中的所有东西。
所以,如果你有一个看起来像这样的模块:
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
才能完全应用这样的更改。