Amazon web services Terraform:向通过弹性beanstalk生成的弹性负载平衡器添加cloudwatch警报

Amazon web services Terraform:向通过弹性beanstalk生成的弹性负载平衡器添加cloudwatch警报,amazon-web-services,terraform,Amazon Web Services,Terraform,我正在为一个弹性Beanstalk应用程序设置Terraform配置,该应用程序将设置ELB。我们希望有一个cloudwatch警报,当ELB出现太多5XX错误时触发。我试图从电子商务环境中传递ELB ARNs,但失败了,并显示以下消息: value of 'count' cannot be computed 我知道这是Terraform的一个常见问题,例如,我无法真正找到解决方法。我们正试图使这个ELB cloudwatch报警模块成为通用模块,因此我无法对ELB的数量进行硬编码 以下是我使

我正在为一个弹性Beanstalk应用程序设置Terraform配置,该应用程序将设置ELB。我们希望有一个cloudwatch警报,当ELB出现太多5XX错误时触发。我试图从电子商务环境中传递ELB ARNs,但失败了,并显示以下消息:

value of 'count' cannot be computed
我知道这是Terraform的一个常见问题,例如,我无法真正找到解决方法。我们正试图使这个ELB cloudwatch报警模块成为通用模块,因此我无法对ELB的数量进行硬编码

以下是我使用的代码:

locals {
  elb_count = "${length(var.load_balancer_arns)}"
}

resource aws_cloudwatch_metric_alarm "panic_time" {
  count = "${local.elb_count}"
  alarm_name          = "${var.application_name}-panic-time"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "HTTPCode_ELB_5XX_Count"
  namespace           = "AWS/ELB"
  period              = "60"
  statistic           = "Sum"
  threshold           = "${var.max_5xx_errors}"

  dimensions {
    LoadBalancer = "${element(var.load_balancer_arns, count.index)}"
  }

  alarm_description = "SNS if we start getting a lot of 500 errors"

  alarm_actions = ["${aws_sns_topic.panic_time.arn}"]
}

resource aws_sns_topic "panic_time" {
  name = "${var.application_name}-panic-time"
}

resource aws_sns_topic_policy "panic_time" {
  arn    = "${aws_sns_topic.panic_time.arn}"
  policy = "${data.aws_iam_policy_document.panic_time_sns.json}"
}

data aws_iam_policy_document "panic_time_sns" {
  statement {
    actions = [
      "SNS:Publish",
    ]

    resources = [
      "${aws_sns_topic.panic_time.arn}",
    ]

    principals {
      type        = "Service"
      identifiers = ["events.amazonaws.com"]
    }
  }
}
我将从main.tf中的环境传入负载平衡器:

load_balancer_arns = "${module.environment.load_balancers}"
(load_balancers输出如下所示:)


没有得到每个环境有多少个ELB。 我为每个环境使用了一个ELB这样的解决方法:

resource "aws_elastic_beanstalk_environment" "some-environment" {
 count = "${length(var.environments)}"
 ...
}

resource "aws_cloudwatch_metric_alarm" "alarm-unhealthy-host-count" {
 count = "${length(var.environments)}"
 ...

 dimensions {
  LoadBalancerName = "${element(aws_elastic_beanstalk_environment.some-environment.*.load_balancers[count.index], 0)}"
 }
}

这很有趣,但我可以将任何值传递给元素(…,val),并且每次我都可以获得每个环境唯一正确的ELB名称。

您能否显示
aws_elastic_beanstalk_environment.main.load_balancers
resource?当您在输出中返回值时,看起来您缺少
.count
。main.load\u balancers是一个列表。我使用length()来确定计数。我假设您返回的列表是以某种方式计算的。你能把它添加到问题中吗?它来自beanstalk环境负载均衡输出:“${aws_elastic_beanstalk_environment.main.load_balancers}”,这是默认的Terraform输出
resource "aws_elastic_beanstalk_environment" "some-environment" {
 count = "${length(var.environments)}"
 ...
}

resource "aws_cloudwatch_metric_alarm" "alarm-unhealthy-host-count" {
 count = "${length(var.environments)}"
 ...

 dimensions {
  LoadBalancerName = "${element(aws_elastic_beanstalk_environment.some-environment.*.load_balancers[count.index], 0)}"
 }
}