Terraform@Azure – 4:変数の利用(設定変更可能な仮想マシンの作成)

入力変数

  • リージョンやリソースグループの指定などは、コード内で複数回出現する可能性がある。また、仮想ネットワークのアドレス帯なども変更が都度発生する可能性が高い
  • コードをより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"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA