Reputation: 3209
I am trying to create a cloudwatch alarm as follows:
module "superb_queue_api-a" {
source = "../../Modules/Services"
no_of_inst = 1
ami_id = "${data.aws_ami.ubuntu.id}"
instance_type = "t2.micro"
subnets = "${data.terraform_remote_state.state_pull.prod-pvt-sub-a}"
key = "sup_queue_inst"
sec-group = ["${aws_security_group.ec2_sg.id}"]
tp = "${var.is_production ? true : false}"
instance-name = "sup-queue-api-a"
}
resource "aws_cloudwatch_metric_alarm" "queue_1" {
alarm_name = "sup-queue-api-a"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "1"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "120"
statistic = "Average"
threshold = "90"
dimensions {
InstanceId = "${module.superb_queue_api-a.ec2-instance}"
}
alarm_description = "This metric monitors ec2 cpu utilization"
alarm_actions = ["${var.terraform_elb_name}"]
}
I am having the following module to spin instance
resource "aws_instance" "ec2_instances" {
count = "${var.no_of_inst}"
#count = "${var.countt}"
ami = "${var.ami_id}"
instance_type = "${var.instance_type}"
#vpc_id = "${var.vpc}"
subnet_id = "${var.subnets}"
key_name = "${var.key}"
vpc_security_group_ids = ["${var.sec-group}"]
disable_api_termination = "${var.tp}"
root_block_device {
volume_size = 100
volume_type = "gp2"
}
tags {
Name = "${var.instance-name}"
}
}
The output.tf has the following
output "ec2-instance" {
value = "${aws_instance.ec2_instances.*.id}"
}
output "private_ip" {
value = "${aws_instance.ec2_instances.*.private_ip}"
}
I am getting the following error:
Error: Error running plan: 1 error(s) occurred:
* aws_cloudwatch_metric_alarm.queue_1: dimensions (InstanceId): '' expected type 'string', got unconvertible type '[]interface {}'
Can someone help me out ?
Upvotes: 1
Views: 1084
Reputation: 8076
The problem is that module.superb_queue_api-a.ec2-instance is an array, because that module is creating more than one instance, and the output of the module is an array with the ids of all instances.
I've adapted the code so it creates an alarm for every instance:
resource "aws_cloudwatch_metric_alarm" "queue_1" {
count = "${length(module.superb_queue_api-a.ec2-instance)}"
alarm_name = "sup-queue-api-a-${module.superb_queue_api-a.ec2-instance[count.index]}"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "1"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "120"
statistic = "Average"
threshold = "90"
dimensions {
InstanceId = "${module.superb_queue_api-a.ec2-instance[count.index]}"
}
alarm_description = "This metric monitors ec2 cpu utilization"
alarm_actions = ["${var.terraform_elb_name}"]
}
Upvotes: 3