We are using Terraform v0.11.1 to maintain our AWS deployments.
We externalized our cloudwatch alarm creation in a module.
resource "aws_cloudwatch_metric_alarm" "metric_alarms" {
count = "${length(var.service_asg_config)*(1-var.is_sqs_based_dimension)}"
alarm_name = "${var.cluster}-${var.name}-${element(split("=",element(split(",",var.service_asg_config[count.index]),1)),1)}-${element(split("=",element(split(",",var.service_asg_config[count.index]),2)),1)}-${element(split("=",element(split(",",var.service_asg_config[count.index]),6)),1)}"
alarm_description = "This alarm monitors if ${var.cluster}-${var.name} ${element(split("=",element(split(",",var.service_asg_config[count.index]),1)),1)} ${element(split("=",element(split(",",var.service_asg_config[count.index]),2)),1)} ${element(split("=",element(split(",",var.service_asg_config[count.index]),6)),1)}"
comparison_operator = "${element(split("=",element(split(",",var.service_asg_config[count.index]),2)),1)}"
evaluation_periods = "${element(split("=",element(split(",",var.service_asg_config[count.index]),4)),1)}"
metric_name = "${element(split("=",element(split(",",var.service_asg_config[count.index]),1)),1)}"
namespace = "${element(split("=",element(split(",",var.service_asg_config[count.index]),0)),1)}"
period = "${element(split("=",element(split(",",var.service_asg_config[count.index]),5)),1)}"
statistic = "${element(split("=",element(split(",",var.service_asg_config[count.index]),3)),1)}"
threshold = "${element(split("=",element(split(",",var.service_asg_config[count.index]),6)),1)}"
dimensions {
ClusterName = "${var.cluster}"
ServiceName = "${var.name}"
}
alarm_actions = ["${aws_appautoscaling_policy.scale_action.*.arn[count.index]}"]
depends_on = ["aws_appautoscaling_policy.scale_action"]
}
One of the limitations we are hitting is regarding the dimensions definition.
Ideally we would like to be able to have them also fully parametrised (number of dimensions, names and values should be all modularised), for the moment we can't find a proper way to pass a full map to the module and use it to define the dimensions.
I tried a lot of things, searched a lot but couldn't find any solution for that, is it a limitation ? Is there some way to do so?