Terraform: Ошибка при создании тревоги CloudWatch для нескольких экземпляров - PullRequest
0 голосов
/ 03 ноября 2018

Я создаю несколько экземпляров ec2 в двух регионах. Я хотел связать сигнал тревоги CloudWatch для проверки состояния и загрузки процессора.

Ниже я упомянул структуру каталогов и код для cloudwatch и main.tf, который представляет вызов модулей.

У меня есть 2 проблемы, включая логику создания аварийных сигналов облачных часов.

Структура каталогов:

├── main.tf
├── modules
│   ├── alb
│   │   ├── aws_alb.tf
│   │   ├── aws_instance.tf
│   │   ├── bootstrap.sh
│   │   ├── cloudwatch.tf
│   │   ├── main.tf
│   │   ├── output.tf
│   │   ├── security-group.tf
│   │   ├── sns.tf
│   │   └── variables.tf
│   └── route53
│       ├── main.tf
│       └── variables.tf
└── variables.tf

main.tf

module "north-virginia" {
  source          = "./modules/alb"
  region          = "us-east-1"
  az              = ["us-east-1a", "us-east-1b", "us-east-1c"]
}

module "oregon" {
  source          = "./modules/alb"
  region          = "us-west-2"
  az              = ["us-west-2a", "us-west-2b", "us-west-2c"]
}

модули / ALB / aws_instance.tf

resource "aws_instance" "web" {
  ami               = "${data.aws_ami.amzn2.id}"
  instance_type     = "${var.instance_type}"
  count             = 3
  availability_zone = "${element(var.az, count.index)}"
  tags {
    Name = "${count.index}"
  }
}

модули / ALB / cloudwatch.tf

resource "aws_cloudwatch_metric_alarm" "cpu_utilization" {
  count               = "${length(local.instance_id_var)}"
  alarm_name          = "${element(split(",", join(",", aws_instance.web.*.id)), count.index)}"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "2"
  metric_name         = "CPUUtilization"
  namespace           = "AWS/EC2"
  period              = "120"
  statistic           = "Average"
  threshold           = "60"
  alarm_description   = "This metric monitors ec2 cpu utilization"

  dimensions {
    InstanceId = "${element(aws_instance.web.*.id, count.index)}"
  }
}

resource "aws_cloudwatch_metric_alarm" "status_check" {
  count               = 3
  alarm_name          = "${element(split(",", join(",", aws_instance.web.*.id)), count.index)}"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "2"
  metric_name         = "StatusCheckFailed"
  namespace           = "AWS/EC2"
  period              = "120"
  statistic           = "Average"
  threshold           = "1"
  alarm_description   = "This metric monitors ec2 status check."

  dimensions {
    InstanceId = "${element(aws_instance.web.*.id, count.index)}"
  }
}

Ожидаемое поведение: Я хочу, чтобы у каждого экземпляра было более 2 аварийных сигналов, прикрепленных к нему в каждом регионе.

Ошибочное поведение: Он создает и подключает 3 сигнала тревоги в каждом регионе с экземплярами.

  • Для региона Северная Вирджиния - один для центрального процессора, два для StatusCheck.
  • Для региона Орегон - два для StatusCheck и один для загрузки ЦП.

Каждый раз, когда я применяю, Он создает сигналы тревоги наоборот.

Я получаю ошибку ниже, которая устраняется, если я жду 2 минуты, пока он обновляет сигнал тревоги, или если я использую terraform apply -parallelism=1

Ошибка:

4 error(s) occurred:

* module.north-virginia.aws_cloudwatch_metric_alarm.status_check[0]: 1 error(s) occurred:

* aws_cloudwatch_metric_alarm.status_check.0: Creating metric alarm failed: ValidationError: A separate request to update this alarm is in progress.
status code: 400, request id: ea6c4502-dede-11e8-9262-c55251d6673a
* module.north-virginia.aws_cloudwatch_metric_alarm.cpu_utilization[1]: 1 error(s) occurred:

* aws_cloudwatch_metric_alarm.cpu_utilization.1: Creating metric alarm failed: ValidationError: A separate request to update this alarm is in progress.
status code: 400, request id: ea6c6c09-dede-11e8-a13f-bbb86ff53045
* module.oregon.aws_cloudwatch_metric_alarm.status_check[1]: 1 error(s) occurred:

* aws_cloudwatch_metric_alarm.status_check.1: Creating metric alarm failed: ValidationError: A separate request to update this alarm is in progress.
status code: 400, request id: ed198a56-dede-11e8-b95a-9d366b9f2e85
* module.oregon.aws_cloudwatch_metric_alarm.cpu_utilization[3]: 1 error(s) occurred:

* aws_cloudwatch_metric_alarm.cpu_utilization.3: Creating metric alarm failed: ValidationError: A separate request to update this alarm is in progress.
status code: 400, request id: ed193c4d-dede-11e8-9c63-21cde1551122

Буду признателен за любую идею или любую конвенцию, которую я здесь упускаю.

1 Ответ

0 голосов
/ 14 ноября 2018

Прежде всего, я бы упростил ваше тестирование, удалив / закомментировав module "oregon". Как только вы получите virginia один правильный, затем добавьте его снова.

Во-вторых, я бы переключил код в вашем модуле, чтобы рассчитать количество как длину var.az. Это должно быть для 3 ресурсов, которые у вас есть: aws_instance и 2 сигналов тревоги CloudWatch. e.g.:

count = "${length(var.az)}"

Таким образом, вы можете изменить # AZ в коде, вызывающем модуль, и динамически изменить # созданных экземпляров.

В-третьих, name, который вы выдаете сигналам CloudWatch, выглядит одинаково. Попробуйте дифференцировать их. e.g.:

alarm_name = "${element(split(",", join(",", aws_instance.web.*.id)), count.index)}-cpu-util"
alarm_name = "${element(split(",", join(",", aws_instance.web.*.id)), count.index)}-status-check"

PS> между тестами убедитесь, что вы очистили все ресурсы, которые могли быть созданы, чтобы убедиться, что вы выполняете чистый тест.

...