terraformにおいて、フォルダ構成のベストプラクティスはよく掲載されている。
しかし、ベストプラクティスに沿って各リソースを構築する際の、変数受け渡し方法については記載されていないことが多かったため、今回まとめてみた。
結論から言うと、Moduleを活用すれば良さそうだ。
Moduleを使わず、Makefileを使う人も居るようだ。その辺は好みだろう。
terraformにおいて各リソース間の変数受け渡しを行う
下記のサンプルは一切、リソースを作成することなく、その辺の動作確認ができるように作成してみた。変数の流れを、ソースに書かれているコメントと併せて確認して貰えればと思う。
動作
簡単に言うと、以下の流れである。
ざっくり言うと、リソースは3つ(ルート・module1・module2)あり、「variables.tf」はそれぞれのリソースで使われるクラス変数的なものの集まり、「output.tf」はリソースの外に出したい変数を定義しているものだと思ってもらえれば良い。
下記のコードを示すとおりに追加し、「terraform init」「terraform plan」「terraform apply」を実行して、成功すれば「module1 variable name ! ap-northeast-1 Module2 !」がターミナルに表示される。
文字列センスがなさすぎて、笑える。
フォルダ構成
/root
|-- /module
| |-- /module1
| | |-- main.tf
| | |-- output.tf
| | |-- variables.tf
| |-- /module2
| | |-- main.tf
| | |-- output.tf
| | |-- variables.tf
|-- main.tf
|-- output.tf
|-- variables.tf
ソース
/module/module1/output.tf
output "module1_output_name" {
value = "${var.module1_variable_name} + ${var.region}"
}
/module/module1/variables.tf
variable "module1_variable_name" {
description = "module1_variable_name"
type = string
default = "module1 variable name !"
}
# module経由で値を受け取る時は、受け取り箱が必要
variable "region" {
type = string
}
/module/module2/output.tf
output "module2_output_name" {
value = "${var.module1_output_name} + Module2 !"
}
/module/module2/variables.tf
# module経由で値を受け取る時は、受け取り箱が必要
variable "module1_output_name" {
type = string
}
/main.tf
module "module1" {
source = "./modules/module1"
# 共通変数を渡す(グローバル変数的な扱い)
region = var.region
}
module "module2" {
source = "./modules/module2"
# module1⇒module2へ値を渡す(リソース間の変数受け渡し)
module1_output_name = module.module1.module1_output_name
# 共通変数を渡すことも可(グローバル変数的な扱い)
# region = var.region
}
/output.tf
# module経由でmodule2の値を受け取り、表示
output "module2_output_name" {
value = module.module2.module2_output_name
}
/variables.tf
# 共通変数
variable "region" {
description = "The AWS region to deploy resources"
type = string
default = "ap-northeast-1" # リージョン(適切なものに変更)
}
コメント