2017-01-25 3 views
1

В terraform есть ли способ условно использовать источник данных? Например:Terraform - условный источник данных

data "aws_ami" "application" { 
    most_recent = true 
    filter { 
     name = "tag:environment" 
     values = ["${var.environment}"] 
    } 
    owners = ["self"] 
} 

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

Я знаю, что с ресурсами вы можете использовать свойство count, но, похоже, вы не можете использовать это с источниками данных.

Я бы подумал о том, чтобы убрать этот код в модуле, но модули также не могут использовать параметр count.

И, наконец, другим вариантом было бы предоставить значение «по умолчанию» для источника данных, если оно было возвращено null, но я не думаю, что это тоже выполнимо.

Есть ли другие возможные решения для этого?

ответ

2

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

В качестве примера я успешно имел эту работу:

data "aws_route53_zone" "private_zone" { 
    count  = "${var.internal == "true" ? 1 : 0}" 
    name   = "${var.domain}" 
    vpc_id  = "${var.vpc_id}" 
    private_zone = "true" 
} 

data "aws_route53_zone" "public_zone" { 
    count  = "${var.internal == "true" ? 0 : 1}" 
    name   = "${var.domain}" 
    private_zone = "false" 
} 

Но тогда были проблемы в том, чтобы затем выбрать выход из него, потому что Terraform будет оценивать любые переменные в тройном условную, прежде чем решить, с какой стороны троичной использовать (вместо ленивой оценки). Так что-то вроде этого не работает:

resource "aws_route53_record" "www" { 
    zone_id = "${var.internal ? data.aws_route53_zone.private_zone.zone_id : data.aws_route53_zone.public_zone.zone_id}" 
    name = "www.example.com" 
    type = "A" 
    alias { 
    name     = "${aws_elb.lb.dns_name}" 
    zone_id    = "${aws_elb.lb.zone_id }" 
    evaluate_target_health = "false" 
    } 
} 

Потому что если internal верно, то вы получите источник private_zone данных, но не источник public_zone данных и поэтому вторая половина троичной не может оценить, потому что data.aws_route53_zone.public_zone.zone_id не и в равной степени с другим путем.

В вашем случае вы, вероятно, просто хотите условно использовать источник данных, так может быть в состоянии сделать что-то вроде этого:

variable "dynamic_ami" { default = "true" } 
variable "default_ami" { default = "ami-123456" } 

data "aws_ami" "application" { 
    most_recent = true 
    filter { 
    name = "tag:environment" 
    values = ["${var.environment}"] 
    } 
    owners = ["self"] 
} 

resource "aws_instance" "app" { 
    ami = "${var.dynamic_ami == "true" ? data.aws_ami.application.id : var.default_ami}" 
    instance_type = "t2.micro" 
} 
+0

Спасибо за все, что информация. Я понятия не имел, что могу использовать счет в источнике данных. Однако идентификатор, вероятно, хочет использовать его больше, как в первых примерах. Проблема в том, что если мой динамический источник данных еще не существует, то запрос aws вызывает сбой. Так что просто поставить тройку в ресурс будет недостаточно. Мне придется поэкспериментировать с этим. Благодаря! – djt

Смежные вопросы