はじめに
この記事では三ヶ月ほどTerraformに触れてきた人間から見た、Terraformで条件分岐をしたくなった時のやり方と使い分けについて書いていく。
Terraformにおける条件分岐処理
まず初めにTerraformには他の言語でいうif文のような命令型の条件分岐は存在しない。その代わりに三項演算子単体や、dynamicやcountと組み合わせて条件分岐を行うのがよくあるやり方だと思われる。
三項演算子の使い方
Terraformの三項演算子の使い方をまず説明していく。
基本的な構文は以下の通りで、conditionに条件式を書き、その結果がtrueだった場合にはtrue_valに書かれたものが結果として出力され、falseの場合にはfalse_valに書かれたものが結果として出力される。
condition ? true_val : false_val
実際に使ってみる。例えば環境によってインスタンスタイプを変えたい場合には以下のように実装していく。
instance_type = var.environment == "Production" ? "t3.large" : "t3.small"
ちなみに条件をいい感じに組み合わせて複雑な条件分岐を実現することも可能である。
instance_type = var.environment == "Production" ? (
var.region == "ap-northeast-1" ? "t3.large" : "t3.medium"
) : "t3.small"
count + 三項演算子で行う条件分岐
countと組み合わせることで、リソースの増減を条件分岐で制御することができるようになる。
例えば以下の例では環境ごとに作成するインスタンス数を分岐させることができる。
resource "aws_instance" "example" {
count = var.environment == "Production" ? 2 : 1
ami = "ami-123456"
instance_type = "t2.micro"
}
dynamic + 三項演算子で行う条件分岐
dynamicと三項演算子を使うとcountよりも柔軟に条件分岐を行うことができる。
dynamicはリソース内の特定のブロックの数を制御することができるので、例えばセキュリティグループの複数ルールを作成する場合やロードバランサーのリスナー設定など、細かい設定の条件分岐を行う際にdynamicは効果的に働く。
以下はセキュリティグループのingress ruleを環境ごとに分岐して作成する例である。
resource "aws_security_group" "example" {
name = "example"
dynamic "ingress" {
for_each = var.environment == "Production" ? [80, 443] : [80]
content {
from_port = ingress.value
to_port = ingress.value
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
}
まとめ
この記事ではTerraformの条件分岐についてまとめた。
- Terraformの条件分岐は三項演算子で行う
- リソース自体を条件分岐させたい場合にはcountと組み合わせるのが効果的である
- リソース内の設定ブロックを条件分岐させたい場合にはdynamicと組み合わせるのが効果的である