djt*_*djt 5 amazon-web-services terraform
在terraform中,有没有办法有条件地使用数据源?例如:
data "aws_ami" "application" {
most_recent = true
filter {
name = "tag:environment"
values = ["${var.environment}"]
}
owners = ["self"]
}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过命令行传递一个环境变量,并根据它,确定天气或不尝试获取此数据源.
我知道有资源可以使用该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"
}
Run Code Online (Sandbox Code Playgroud)
但后来在如何选择它的输出方面存在问题,因为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"
}
}
Run Code Online (Sandbox Code Playgroud)
因为如果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"
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4394 次 |
最近记录: |