入力変数
- リージョンやリソースグループの指定などは、コード内で複数回出現する可能性がある。また、仮想ネットワークのアドレス帯なども変更が都度発生する可能性が高い
- コードをよりDRYかつ設定変更可能にするため、Terraformでは入力変数(input variable)が定義できる
DRY原則を守るとは、言い換えれば「すべての知識はシステム内において、単一、かつ明確な、そして信頼できる表現になっていなければならない」という条件を満たすことです。
https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/DRY%E5%8E%9F%E5%89%87/#google_vignette
- 文法
variable "NAME" {
[CONFIG...]
}
- description
- 変数がどのように使われるのか説明文を挿入
- default
- 変数に値を与える方法は、コマンドラインで渡す、ファイルで渡す、環境変数で渡す、がある。値が指定されたなかったとき、ここに指定した値がデフォルト値として使用される
- type
- エラーを防ぐため、常に何らかの型制約を定義しておくのが良い(string、number、list、・・・)
- validation
- 数に対する最大値や最小値を強制するなど、入力変数に対して基本的な型チェック以上のルールを定義できる
- sensitive
- 入力変数に対してこのパラメータをtrueに設定した場合、planやapplyを実行した際にTerraformはその値をログに残さない
- 例1
variable "number_example" {
description = "number型変数の例"
type = number
default = 42
}
- 例2
variable "list_example" {
description = "リスト型の変数の例"
type = list
default = ["a", "b", "c"]
}
変数参照
- Terraformコード内で、入力変数の値を使いたい場合は、変数参照(variable reference)を使う
var.<変数名>
出力変数
- 出力変数を使うとterraform applyを実行した際、情報をコンソールに出力する
- terraform outputコマンドを使うと、変更を適用しないで出力だけを一覧表示できる
output "<NAME>" {
value = <VALUE>
[CONFIG...]
}
- NAME
- 出力変数の名前
- VALUE
- 出力したいTerraform式
- description(オプション)
- sensitive(オプション)
- Terraformがplanやapplyの最後にこの出力を表示しないように指示するため、このパラメータをtrueにする
- depends_on(オプション)
- 通常はコード内の参照を元に自動的に依存性グラフを導き出すが、まれに追加のヒントを与える必要があるケースがある
今回のコード
- 今回はコードを下記のように修正
variable "subscription_id" {
description = "デプロイするAzureサブスクリプションを指定"
type = string
default = "xxxxxxxxxxxxxxxxxxx"
}
variable "tenant_id" {
description = "デプロイするAzureテナントを指定"
type = string
default = "xxxxxxxxxxxxxxxxxxx"
}
variable "client_id" {
description = "アプリケーションIDを指定"
type = string
default = "xxxxxxxxxxxxxxxxxxx
}
variable "client_secret" {
description = "アプリケーションのシークレットを指定"
type = string
default = "xxxxxxxxxxxxxxxxxxx"
}
variable "region" {
description = "各リソースをデプロイするリージョンを指定"
type = string
default = "Japaneast"
}
variable "vnet_ip" {
description = "VNETのアドレス空間を指定"
type = string
default = "10.0.0.0/16"
}
variable "subnet_ip" {
description = "サブネットのアドレス空間を指定"
type = string
default = "10.0.1.0/24"
}
variable "virtual_machine_size" {
description = "仮想マシンのサイズを指定"
type = string
default = "Standard_A1"
}
variable "storage_account_type" {
description = "仮想マシンのストレージタイプを指定"
type = string
default = "Standard_LRS"
}
variable "resource_group_name" {
description = "リソースグループの名前を指定"
type = string
default = "rg-tf"
}
variable "vnet_name" {
description = "仮想ネットワークの名前を指定"
type = string
default = "vnet-01"
}
variable "subnet_name" {
description = "サブネットの名前を指定"
type = string
default = "snet-01"
}
variable "nsg_name" {
description = "NSGの名前を指定"
type = string
default = "nsg-01"
}
variable "nic_name" {
description = "仮想マシンにアタッチするNICの名前を指定"
type = string
default = "nic-vm-winsrv2022"
}
variable "vm_winsrv_name" {
description = "仮想マシンの名前を指定"
type = string
default = "vm-winsrv2022"
}
provider "azurerm" {
features {}
subscription_id = var.subscription_id
client_id = var.client_id
client_secret = var.client_secret
tenant_id = var.tenant_id
}
resource "azurerm_resource_group" "rg-tf" {
name = var.resource_group_name
location = var.region
tags = {
environment = "Staging"
}
}
resource "azurerm_virtual_network" "vnet-01" {
name = var.vnet_name
address_space = [var.vnet_ip]
location = azurerm_resource_group.rg-tf.location
resource_group_name = azurerm_resource_group.rg-tf.name
}
resource "azurerm_subnet" "subnet-01" {
name = var.subnet_name
resource_group_name = azurerm_resource_group.rg-tf.name
virtual_network_name = azurerm_virtual_network.vnet-01.name
address_prefixes = [var.subnet_ip]
}
resource "azurerm_network_security_group" "nsg-01" {
name = var.nsg_name
location = azurerm_resource_group.rg-tf.location
resource_group_name = azurerm_resource_group.rg-tf.name
}
resource "azurerm_network_interface" "nic-vm-winsrv2022" {
name = var.nic_name
location = azurerm_resource_group.rg-tf.location
resource_group_name = azurerm_resource_group.rg-tf.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet-01.id
private_ip_address_allocation = "Dynamic"
}
}
resource "azurerm_windows_virtual_machine" "vm-winsrv2022" {
name = var.vm_winsrv_name
resource_group_name = azurerm_resource_group.rg-tf.name
location = azurerm_resource_group.rg-tf.location
size = var.virtual_machine_size
admin_username = "adminuser"
admin_password = "P@$$w0rd1234!"
network_interface_ids = [
azurerm_network_interface.nic-vm-winsrv2022.id,
]
os_disk {
caching = "ReadWrite"
storage_account_type = var.storage_account_type
}
source_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2022-Datacenter"
version = "latest"
}
}
output "vm_winsrv_resource_id" {
value = azurerm_windows_virtual_machine.vm-winsrv2022.id
}
Terraform applyの実行
- defaultがない場合は、applyコマンドを実行すると変数の値を入力するようにTerraformは対話的に質問してくる
- 対話的なプロンプトが現れてほしくない場合は、-varコマンドラインオプションを渡す
- planやapplyを実行するたびにコマンドライン引数を考えたくなければ、default値を設定しておく
- outputに作成した仮想マシンのリソースIDを指定しているので、デプロイ完了後にプロンプトに表示される
$ terraform apply
・・・
Apply complete!
Outputs:
vm_winsrv_resource_id = "/subscriptions/xxxxxxxxxxxxxxxxxxx/resourceGroups/rg-tf/providers/Microsoft.Compute/virtualMachines/vm-winsrv2022"