2017-09-21 68 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才能完全應用這樣的更改。