Я создавал тревогу облачных часов в моем стеке 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
для эльба в измерении и alarm_name в моем будильнике облачных часов.
Может кто-нибудь точно объяснить, что вызывает такое поведение? Спасибо.
В -target
опция - это запрос к Terraform на планирование операций только для выбранных экземпляров ресурсов. и все, от чего они зависят. Если есть ожидающие изменения для чего-то, от чего зависит ваш целевой ресурс, тогда нет возможности пропустить их обновление, потому что это приведет к противоречивому результату.
Использование постоянного или локального значения, которое не зависит от чего-либо еще, позволит дополнительно ограничить объем операции, потому что в этом случае ресурс не зависит от чего-либо, что имеет видимые извне побочные эффекты, и, следовательно, изменения, включенные по причинам зависимости, не будут явно отображаться в плане.
-target
следует использовать только в особых исключительных ситуациях, когда сообщение об ошибке Terraform предполагает, что вы это делаете, или когда вы исправляете более раннюю ошибку. Он не предназначен как механизм, позволяющий избежать применения изменений, которые вы уже внесли в свою конфигурацию.
Согласно этому официальному док, когда мы указываем путь к модулю, «цель» применяется ко всем ресурсам в указанном модуле и ко всем дочерним модулям указанного модуля.
Вот почему при использовании жестко заданного значения для elb мы не получаем целевых зависимостей.
Но мы используем путь к модулю, документы, в которых также упоминается: «Если путь к модулю указан без спецификации ресурса, адрес применяется ко всем ресурсам в модуле».