2017-07-19 4 views
2

環境がプロダクションか非プロダクションかに応じて、異なるKMS CMKを使用してAWS RDSインスタンスを作成します。これは、異なるアドレスを持つ別のKMSキーでRDSインスタンスをスピンアップ出力内のテーラフォーム補間

count = "${var.bluegreen == "nonprod" ? 1 : 0}" 

:だから私はあればテラフォーム・カウントを使用する2つのリソースを持っています。私はそのエンドポイントをキャプチャする必要があります(これはビルドの終了後にterraform showで行います)。なぜTerraformではこれが機能しませんか?

output "rds_endpoint" { 
    value = "${var.bluegreen == "nonprod" ? aws_db_instance.rds_nonprod.address : aws_db_instance.rds_prod.address}" 
} 
+1

私はこの回避策を知っています - kms_key_id = "$ {var.bluegreen ==" nonprod "?" arn:aws:kms:eu-west-2:1234567890:key/foo ":" arn:aws:kms :eu-west-2:1234567890:キー/バー "}"を1つのaws_db_instanceリソースに入れて、aws_db_instanceリソースを1つ(2つから)に減らします。 – Chris

答えて

1

count = 0を持っているリソースの属性にアクセスするとエラーになり、このような表現は、失敗する可能性がありますので、残念ながらテラフォームは現在、そのチェックステップの間、条件付きの「側面」の両方をチェックします。これに伴って、状態がまだ完了していないとき(例えば、-targetを使用した結果として)に出力が生成される可能性があるため、出力のエラーが明示されないという現在の動作があります。これらの煩さはすべて、この場合には多くの混乱を招きます。

この場合条件式を使用する代わりに、count = 0の場合に空のリストに評価される「スプラット式」を使用する方が効果的です。これは、次のようなものだろうになります。

output "rds_endpoint" { 
    value = "${element(concat(aws_db_instance.rds_nonprod.*.address, aws_db_instance.rds_prod.*.address), 0)}" 
} 

これはnonprodアドレスとPRODアドレスのすべてのすべてを一緒に連結することによって作成されたリストの最初の要素を取ります。これらのリソースブロックにcountをどのように設定したかによって、結果のリストは1つの要素しか持たないため、その要素を取るだけです。

一般に、出力に関する問題をデバッグするには、terraform consoleなどの式を評価して、出力のエラーを無視するという制限を回避すると便利です。

+0

偉大な答えは、私は "スプラットの表現"を考慮していなかった。あなたの答えから、私がカウントを使用した方法に別の方法があると仮定することができますか?私はこのメソッドから予期せぬ動作を見てきました。例えば、カウント比較が同じでなければならない場合(青色はまだnonprodに等しい)、awsセキュリティグループのルールリソースが2回目に破棄されます。 – Chris

+0

実際に 'element'関数にはいくつかの課題があります。これは、' 'というものを渡すと、その結果が計算されます。これは、Terraformのコアがすべての関数を慎重に扱うためです。この場合、私は問題を "1つまたは他の"状況のように見ていないので、問題は予期しませんでしたが、それらの間を接続する 'count.index'という関連リソースをたくさん作成すると難しくなります。 'bluegreen'が' nonprod'に設定されている限り、ここでは安定しているはずです。 –