Terraformの便利な機能、moduleの使い方についてざっくりとまとめていきます。
moduleとは?
terraformに導入することで、別環境で同じリソースを使いまわすことができます。
環境ごとに異なる設定値は変数にいれることで設定できます。
複雑なディレクトリ構成
moduleを使うと便利なのですが、その分ディレクトリ構成が複雑になります。
通常のディレクトリ構成
dir ├── production │ ├── vm.tf │ ├── network.tf │ └── storage.tf └── staging ├── vm.tf └── network.tf
moduleを使用した場合
dir ├── module │ ├── vm │ │ ├── variable.tf │ │ ├── output.tf │ │ └── vm.tf │ ├── network │ │ ├── variable.tf │ │ ├── output.tf │ │ └── network.tf │ └── storage │ ├── variable.tf │ ├── output.tf │ └── storage.tf └── japaneast ├── main.tf └── variable.tf
各ファイルの内容
japaneast/main.tfでmodule内のtfファイルを読み込みます。
##japaneast/main.tf module "vm" { source = "../module/vm" #module内のvm.tfに使用したvm_sizeという変数をjapneast/variable内から呼び出す vm_size = var.vm_size #module内のvm.tfに使用したinterface_idという変数をmodule/network/output.tfから呼び出す interface_id = module.network.interface_id }
output.tfでは、リソースのidやnameなどの値を他のリソースで参照できるように出力します。
##module/network/output.tf output "interface_id" { value = azurerm_network_interface.test.id }
環境.変数と設定し、terraformのworkspaceを設定することで環境ごとに異なる値を設定することができます。
##japaneast/variable.tf variable "vm" { default = { stg.vm_size = "Standard_DS1_v2" dev.vm_size = "Standard_B2S" } }
まとめ
moduleを使うと普通に書くより可読性は低くなりますが、何度も同じリソースを書く必要がないし管理もしやすくなるので個人的には結構好きでした!
あと書くのがめちゃくちゃ楽しいです!!😇
環境によって不必要なリソースはcountを使って制御するといいですよ!