2017-01-25 5 views
1

terraformでは、条件付きでデータソースを使用する方法はありますか?たとえば:Terraform - 条件付きデータソース

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

私は、コマンドラインを経由して環境変数を渡すことができるように願っていて、それに基づいて、試してみて、このデータソースを取得するために、天候を決定するかではありません。

私はリソースでcountプロパティを使用することができますが、それをデータソースで使用することはできません。

このコードをモジュール内に埋め込むことを検討しますが、モジュールではcountパラメータも使用できません。

最後に、もう1つのオプションは、データソースに「デフォルト」の値を提供することです。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" 
} 

をしかし、その後テラフォームが三成分のどちら側を決定する前に三条件のいずれかの変数を評価しますので、それの出力を選択する方法に問題がありました使用する(遅延評価の代わりに)。したがって、このようなものは動作しません:internalがtrueの場合、あなたはprivate_zoneデータソースではなくpublic_zoneデータソースを取得し、その三元の後半はdata.aws_route53_zone.public_zone.zone_idではないので、評価に失敗し

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" 
    } 
} 

のでもう一方の方法でも同様に定義されます。あなたはおそらく、条件付きデータソースを使用したいあなたのケースで

ので、このような何かを行うことができるかもしれない:すべてのその情報について

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

感謝。データソースでカウントを使用できるかどうかはわかりませんでした。しかし、あなたが最初の例のようにidを使用したいと思うかもしれません。問題は、私の動的データソースがまだ存在しない場合、awsへのクエリは失敗を引き起こすことです。だから、リソースに三項関係を置くだけでは不十分です。私はこれで実験しなければならないでしょう。ありがとう! – djt