はじめに
Terraformを触り始めてまだ日が浅いのですが、書いていて毎回止まるポイントがあります。
「この値、variable? locals?」
どっちも「変数」っぽいし、とりあえず動くから雑に書いてしまいがち…
でもあとから読むと「なぜここで locals?」みたいになることが多かったので、
自分なりに整理した内容をメモとして残します。
また、今回の変数まわりの考え方については、
Terraformで学ぶAWS(1): サーバーレスから始める再利用可能なインフラストラクチャ
をかなり参考にしています。
Terraformを学び始めた自分にとって、
「なぜそう書くのか」を丁寧に説明してくれる内容で、とても助けられています。
著者さま:https://qiita.com/koshian2
まず結論
最初に結論を書いておきます。
| 種類 | 役割 |
|---|---|
| variable | 外から値を渡したいとき |
| locals | モジュールの中だけで使う値 |
外部入力か、内部用か
ここでほぼ決まるな、という理解になりました。
locals:モジュール内だけで使う値
locals は、Terraform のコードの中だけで完結する変数です。
外から値を渡すことはできません。
使いどころ(初心者目線)
- 同じ値を何回も書くのがつらい
- 文字列を組み立てたい
- ちょっとした計算結果をまとめたい
例:localsで文字列を組み立てる
locals {
app_name = "sample-app"
replica = 2
}
output "info" {
value = "Application ${local.app_name} is running with ${local.replica} replicas."
}
terraform apply すると、こんな感じで出ます。
Application sample-app is running with 2 replicas.
学んだこと
- 参照は
local.<名前> - 外部から値は渡せない
- 文字列結合するときは
${}が必要
AWSのリソース名に環境名を付ける、みたいな用途でよく使われそうだなと思いました。
variable:外部から値を受け取る変数
variable は、Terraformの外から値を渡すための変数です。
- 環境ごとに値を変えたい
- モジュールを再利用したい
- 本番・検証で切り替えたい
こういうときは variable。
locals の例を variable で書き直す
variable "app_name" {
type = string
default = "sample-app"
}
variable "replica" {
type = number
default = 2
}
output "info" {
value = "Application ${var.app_name} is running with ${var.replica} replicas."
}
このまま terraform apply すると、locals のときと同じ結果になります。
-var で一時的に値を変える
terraform apply 実行時に -var を付けると、
デフォルト値を上書きできます。
terraform apply -var="app_name=api"
Application api is running with 2 replicas.
複数もOK。
terraform apply -var="app_name=batch" -var="replica=1"
Application batch is running with 1 replicas.
ただ、毎回これを打つのは正直しんどいです。
terraform.tfvars:変数をまとめて書く
そこで使うのが terraform.tfvars。
構成
.
├── main.tf
└── terraform.tfvars
main.tf(変数定義)
variable "app_name" {
type = string
default = "sample-app"
}
variable "replica" {
type = number
default = 2
}
output "info" {
value = "Application ${var.app_name} is running with ${var.replica} replicas."
}
terraform.tfvars
app_name = "frontend"
replica = 4
この状態で terraform apply すると、
Application frontend is running with 4 replicas.
になります。
環境ごとの設定を書く場所、という理解をしました。
変数の優先順位でちょっとハマった
Terraformの変数には優先順位があります。
高い順に:
- 環境変数
- terraform.tfvars
- -var オプション
- variable の default
「なんで値変わらないんだ?」と思ったら、
どこかで上書きされていることが多かったです。
自分なりの整理まとめ
今の自分の理解はこんな感じです。
- 外から変えたい →
variable - 中だけで使う →
locals - variable を加工した結果 →
locals