システムを作る中で冗長性を上げるために同構成の仮想マシンを2つ作る、といったことはよくあると思いますが、同じものを何度も手動で作り上げるのは大変です。
また、IaCで構築する際も、同じ内容のものをいくつも書いていると、コードが冗長になったり、パラメータに修正があったときに何か所も変更しなければなりません。
そのため、今回はモジュール化を用いて同構成のリソースを簡単に複製する方法について紹介します。モジュールを使うことで、コードの冗長化を防ぎ、パラメータの修正も1か所するだけで済むようになります。
フォルダ構成
実行するプログラムをmainフォルダに、呼び出し先のプログラムをmoduleフォルダに分け、mainプログラムからmoduleプログラムを呼び出すような構成にします。
こうすることで、実行部分(main)と細かいパラメータの実装部分(module)を分けて管理することができ、コードが見やすく保守性も高まります。
root | |__main | |___main.tf | |__module | |___module.tf | |___module2.tf
module
まずはmoduleファイルについてです。moduleファイルでは通常通りresourceブロックを作成し、パラメータを埋め込んでいきます。その中でリソースごとに変更したいパラメータ(リソース名など)は変数化しておきます。
resource "azurerm_virtual_machine" "vm" {
name = var.vm_name #リソースごとに名前を変えたいので変数化しておく
location = "japan east"
vm_size = "Standard_B1ls"
....
tags = {
Name = var.vm_name
}
}
variable "vm_name"{} #変数定義
moduleファイル内では複数サービスを定義することができ、同時に呼び出すことができます。VMを作成する際はnicが必要になるので、同ファイルに定義する、といったことができます。
#nic
resource "azurerm_network_interface" "nic" {
name = var.nic_name
location = "japan east"
...
}
#vm
resource "azurerm_virtual_machine" "vm" {
name = var.vm_name #リソースごとに名前を変えたいので変数化しておく
location = "japan east"
vm_size = "Standard_B1ls"
....
tags = {
Name = var.vm_name
}
}
variable "nic_name"{} #変数定義
variable "vm_name"{}
モジュールの呼び出し(main.tf)
モジュールを作成できたらあとは呼び出すだけです。ここではソースとなるファイルを指定し、変数化していた部分にパラメータを定義します。
module "vm1"{
source = "../module/module.tf" #ソースファイル呼び出し
nic_name = "nic1" #事前定義していた変数に値を入力
vm_name = "vm1"
}
module "vm2"{
source = "../module/module.tf"
nic_name = "nic2"
vm_name = "vm2"
これで準備は完了です。あとはmainフォルダ内で「terraform apply」を実行すれば同構成のマシンを作成することができます。
おわりに
今回はリソースをモジュール化し、同構成のリソースを複数構築する方法について紹介しました。手動で作成するよりかなり楽ですし、コードも短くきれいになるのでぜひ利用してみてください
