При использовании параметра target в terraform, почему он иногда возвращает другие ресурсы наряду с целевым? - PullRequest
0 голосов
/ 30 апреля 2020

Я создавал тревогу из облачных часов в моем стеке ELB следующим образом:

module "elb_sg" {
  source                   = "git@github.com:terraform-aws-modules/terraform-aws-security-group.git"
  name                     = "${local.name}-elb-sg"
  description              = "Allow internet inbound traffic"
  vpc_id                   = "${data.terraform_remote_state.vpc.vpc_id}"
  ingress_with_cidr_blocks = "${data.null_data_source.elb_sg_rules.*.inputs}"
  tags                     = "${local.tags}"

  # Open egress for all
  egress_with_cidr_blocks = "${local.open_egress}"
}

#  ELB
module "elb" {
  source                      = "git@github.com:terraform-aws-modules/terraform-aws-elb.git"
  name                        = "${local.name}"
  subnets                     = ["${split(",",local.elb_subnets)}"]
  internal                    = "${var.internal}"
  security_groups             = "${local.elb_security_group_ids}"
  cross_zone_load_balancing   = "${var.cross_zone_load_balancing}"
  idle_timeout                = "${var.idle_timeout}"
  connection_draining         = "${var.connection_draining}"
  connection_draining_timeout = "${var.connection_draining_timeout}"
  listener                    = ["${var.listener}"]
  access_logs                 = ["${var.access_logs}"]
  health_check                = ["${var.health_check}"]
  tags                        = "${local.tags}"
}


# Cloudwatch alarms
data "aws_elb" "classic_lb" {
  count = "${module.elb.this_elb_name != "" ? 1 : 0}"
  name  = "${module.elb.this_elb_name}"
}

resource "aws_cloudwatch_metric_alarm" "low_healthy_host_count_alarm" {
    count                = "${var.create_alarm ? 1 : 0}"
    # alarm_name         = "${module.elb.this_elb_name}-HealthyHostCount"
    alarm_name           = "${data.aws_elb.classic_lb.name}-HealthyHostCount"
    dimensions {
      # LoadBalancerName = "${module.elb.this_elb_name}"
      LoadBalancerName   = "${data.aws_elb.classic_lb.name}"
    }
    ...
}

Однако я попытался использовать data source, а также прямой доступ к модулю, например ${module.elb.this_elb_name}, для получения имени ELB как он существует в AWS (а не в моем локальном, поскольку иногда AWS может обрезать длинные имена). Но оба раза при нацеливании только на сигнал тревоги, например terraform plan -target=aws_cloudwatch_metric_alarm.low_healthy_host_count_alarm, я получаю и другие ресурсы, которые мне не нужны.

Terraform will perform the following actions:

  + aws_cloudwatch_metric_alarm.low_healthy_host_count_alarm
      id:                                    <computed>
      actions_enabled:                       "true"
      ...

  ~ module.elb_sg.aws_security_group.this
      ...

  ~ module.elb.module.elb.aws_elb.this
      access_logs.#:                         "0" => "1"
      access_logs.0.bucket:                  "" => "test-logs"
      access_logs.0.enabled:                 "" => "true"
      access_logs.0.interval:                "" => "60"
      ...


Plan: 1 to add, 2 to change, 0 to destroy.

Проблема исчезает, когда я использую жестко закодированное имя или local.name для elb в измерении и alarm_name в моем будильнике cloudwatch.

Может кто-нибудь точно объяснить, что вызывает такое поведение ? Спасибо.

1 Ответ

0 голосов
/ 01 мая 2020

Согласно этому официальному do c, когда мы указываем путь к модулю, «target» применяется ко всем ресурсам в указанном модуле и ко всем потомкам модулей указанного модуля.

Вот почему, когда мы используем жестко закодированное значение для elb, мы не получаем целевых зависимостей.

Но мы используем путь к модулю , в документах которого также упоминается " Если путь к модулю указан без ресурса spe c, адрес применяется ко всем ресурсам в модуле. "

...