【问题标题】:Terraform: Add cloudwatch alarm to elastic load balancer generated through elastic beanstalkTerraform:将 cloudwatch 警报添加到通过弹性 beantalk 生成的弹性负载均衡器
【发布时间】:2018-11-21 22:22:19
【问题描述】:

我正在为设置 ELB 的 Elastic Beanstalk 应用程序设置 Terraform 配置。我们希望有一个 cloudwatch 警报,当 ELB 收到太多 5XX 错误时触发。我正在尝试从 EB 环境传递 ELB ARN,但它失败并显示以下消息:

value of 'count' cannot be computed

我知道这是 Terraform 的一个常见问题,例如https://github.com/hashicorp/terraform/issues/10857我真的想不出一个解决方法。我们正在尝试使这个 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 输出如下所示:)

output load_balancers {
  value = "${aws_elastic_beanstalk_environment.main.load_balancers}"
}

【问题讨论】:

  • 您能显示aws_elastic_beanstalk_environment.main.load_balancers 资源吗?当您在输出中返回值时,您似乎缺少.count。
  • main.load_balancers 是一个列表。我正在使用 length() 来确定计数。
  • 我假设您返回的列表是以某种方式计算的。你能把它添加到问题中吗?
  • 它来自 beanstalk 环境 load_balancers 输出:"${aws_elastic_beanstalk_environment.main.load_balancers}" 这是默认的 Terraform 输出 terraform.io/docs/providers/aws/r/…

标签: amazon-web-services terraform


【解决方案1】:

没有得到每个环境有多少 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)}"
 }
}

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

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2019-10-21
    • 2015-09-23
    • 2023-04-03
    • 2021-03-18
    • 2021-05-26
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多