Nishant Singh
Nishant Singh

Reputation: 3209

Terraform : Unable to create cloudwatch alarm on a instance

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

Answers (1)

Ignacio Millán
Ignacio Millán

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

Related Questions