Terraform CLI -vars-fileオプションでファイル指定時もルートディレクトリのterraform.tfvarsは読み込まれる
Terraform利用時に環境差異をtfvarsで表現するパターンがあると思います。
具体的には、以下のようなものです。
ディレクトリ構成
.
├── envs
│ ├── dev
│ │ └── terraform.tfvars
│ ├── prod
│ │ └── terraform.tfvars
│ └── test
│ └── terraform.tfvars
├── main.tf
└── variables.tf
terraformコマンド実行
terraform plan -var-file="./dev/terraform.tfvars"
環境共通の値をtfvarsで渡したいときがあります。
環境ごとのterraform.tfvars
(例: envs/dev/terraform.tfvars
)に書けば実現できますが、少し冗長です。
そんなときは、ルートディレクトリに共通の値を記載したterraform.tfvars
を配置すればよいです。
-var-fileオプション使用時でも、ルートディレクトリのterraform.tfvars
は読み込まれます。
.
├── envs
│ ├── dev
│ │ └── terraform.tfvars
│ ├── prod
│ │ └── terraform.tfvars
│ └── test
│ └── terraform.tfvars
├── main.tf
├── terraform.tfvars # 追加
└── variables.tf
実際にやってみます。
やってみた
ディレクトリ構成
.
├── envs
│ ├── dev
│ │ └── terraform.tfvars
│ ├── prod
│ │ └── terraform.tfvars
│ └── test
│ └── terraform.tfvars
├── main.tf
├── terraform.tfvars
└── variables.tf
tfファイル
terraform.tfvars
の動作確認のため、シンプルにvariablesの値を出力するだけです。
output "system_name" {
value = var.system_name
}
output "env" {
value = var.env
}
variablesは、環境共通値としてsystem_name
、環境固有の値としてenv
を定義します。
ルートディレクトリのterraform.tfvars
が読み込まれることを確認するために、system_name
にはデフォルト値をあえて指定しないでおきます。
variable "system_name" {
type = string
}
variable "env" {
type = string
default = "none"
}
ルートディレクトリにある環境共通のterraform.tfvars
は以下のように、system_name
の値をセットします。
system_name = "sato"
環境固有のterraform.tfvars
についてです。
それぞれenv
に環境名をセットします。
env = "dev"
Terraform実行
vars-fileを指定して、terraformを実行してみます。
$ terraform plan -var-file="./envs/dev/terraform.tfvars"
Changes to Outputs:
+ system_name = "sato"
+ env = "dev"
env
は、"./envs/dev/terraform.tfvars"
、system_name
はterraform.tfvars
の値が使われていることが確認できました。
おまけ: Terraform Variable読み込みの優先順位
この記事では、terraform.tfvars
ファイルを使って、変数を渡す方法使いました。
変数はterraform.tfvars
ファイル以外にも、環境変数やファイルterraform.tfvars.json
*auto.tfvars
で渡すことができます。
tfvarsの読み込みの優先順位は以下のドキュメントに記載があります。
Input Variables - Configuration Language | Terraform | HashiCorp Developer
-var-file
オプションの優先度が一番高いです。
例えば、今回のコードのルートディレクトリのterraform.tfvars
でVariableenv
を設定しても、-var-file
オプションで設定したenv
の値が優先されます。
system_name = "sato"
env = "sato" # 追加
$ terraform plan -var-file="./dev/terraform.tfvars"
Changes to Outputs:
+ system_name = "sato"
+ env = "dev"
おわりに
先日、Best practices for using the Terraform AWS Providerが公開されました。
こちらでは、tfvarsで環境差異をディレクトリ構成が紹介されていて、ルートディレクトリにもterraform.tfvars
と環境ディレクトリそれぞれにterraform.tfvars
があるパターンでした。
この方法を使ったことが無かったので、気になりブログにしてみました。
以上、AWS事業本部の佐藤(@chari7311)でした。