在terraform中,有没有办法有条件地使用数据源?例如:
data "aws_ami" "application" { most_recent = true filter { name = "tag:environment" values = ["${var.environment}"] } owners = ["self"] }
我希望能够通过命令行传递一个环境变量,并根据它,确定天气或不尝试获取此数据源.
我知道有资源可以使用该count
属性,但似乎你不能将它用于数据源.
我会考虑将这个代码放在模块中,但模块也不能使用该count
参数.
最后,另一种选择是为数据源提供"默认"值,如果它返回null,但我认为这也不可行.
还有其他可能的解决方案吗?
事实上,您可以使用数据源计数的条件,但是当我尝试时,我还没有设法为它设计一个好的用例.
作为一个例子,我成功地使用了这个:
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" }