TerraformでAzure VM(仮想マシン)の作成、NSG割当、削除までをやってみた

Azure,Others,Terraform,Virtual Machine

TerraformとはHashiCorp社が提供するコードを利用してクラウドなどのリソースをデプロイする為のIaC(Infrastructure as Code)ツールになります。
Terraform を使うとAzure等のパブリッククラウドのリソースも操作する事が出来ます。

前回は初めてのTerraformと言う事でインストールからAzure リソースグループの作成、削除という一連の流れをやってみました。
今回は仮想マシン(Azure VM)の作成をやってみます。

今回の設定作業にあたっては、こちらのサイトを参考に実施しております。

Terraform を使用して Azure に Linux VM とインフラストラクチャを作成する(MS社公式)

スポンサーリンク

作成したAzure VM(仮想マシン)やTerraformファイル

作成したAzure VM(仮想マシン)の主な構成

今回は以下のような構成でAzure VM(仮想マシン)を作成しています。

区分 項目 設定値
リソースグループ リソースグループ名 test-rg
場所 米国東部2(eastus2)
仮想ネットワーク 仮想ネットワーク名 vnet-01
アドレス空間
10.0.0.0/16
サブネット サブネット名 subnet-01
サブネットアドレス空間
10.0.1.0/24
パブリックIP パブリックIP名 pubip-01
ネットワークインターフェース ネットワークインターフェース名
test-vm-01-nic
仮想マシン 仮想マシン名
terra-testvm-01
OS
CentOS 8.1(Gen2)
仮想マシンサイズ Standard_B1ms
管理者ユーザー名
adminuser
管理者パスワード
P@$$w0rd1234!
ディスク名 test-vm-01_OsDisk

作成したTerraformのファイル

今回作成したファイルは表の通りとなります。主にTerraform自体の設定ファイル、Azure VM(仮想マシン)のテンプレートファイルで構成されています。
今回作成したファイルはすべて同じディレクトリに配置しています。

作成したファイル
Terraform自体の設定ファイル

main.tf

TerraformでAzureリソースを操作する為の設定ファイルです。
required_providers(terraform Block)、required_version(terraform Block)、azurerm(provider Block)を指定しています。Terraformがどのプロバイダー(Azure等)を利用するのか指定します。

Provider Requirements(Terraform)
terraform Block(Terraform)

リソースに関するテンプレートファイル
vm.tf

Azure VM(仮想マシン)に関するテンプレートファイルです。
1つのファイルの中で仮想マシンに関連するリソースをすべて定義しています。

azurerm_virtual_machine(Terraform)

※ファイル名は任意ですが拡張子が.tfである必要があります。

Terraformでリソースをデプロイする際に利用したコマンド

今回利用したコマンドはterraform apply、terraform destroyになります。
terraform init実行済みの前提となります。

利用したTerraformコマンド
terraform apply resourceで定義されたリソースをデプロイします。
新規リソース作成や既存リソースの変更を行います。
terraform destroy 指定したリソースを削除します。
指定しない場合はすべてのリソースを削除します。

※今回はオプションを含めて最低限の利用にしております。

Azure VM(仮想マシン)デプロイ用ファイル(.tfファイル)

main.tfの内容

main.tfでTerraformがAzureリソース操作する為の設定をします。

main.tf

terraform Blockでrequired_versionとrequired_providersを指定しています。

provider Blockでazurermの情報を指定します。
今回は指定してませんが、デプロイするデフォルトリージョンやタグ等の指定が行えます。

 

terraform {
  required_version = “>= 0.12"
  required_providers {
    azurerm = {
      source  = “hashicorp/azurerm"
      version = “=2.46.0"
    }
  }
}

provider “azurerm" {
  features {}
}

vm.tfの内容

vm.tfでTerraformでAzure VM(仮想マシン)リソースをデプロイする為の定義をしています。
仮想マシンだけではなく関連する仮想ネットワークやパブリックIP等のリソースも併せて定義しています。

※リソースブロックの順番はどのような順番でも問題ありません。Terraform側で依存関係を解釈して適切な順番でデプロイしてくれます。

設定ファイル

リソースグループ、仮想ネットワーク、サブネット、パブリックIP、ネットワークインターフェースと言ったAzure VM(仮想マシン)の関連リソースを定義します。

各リソースをデプロイするリソースグループはazurerm_resource_group.rg-01.nameと記載しています。
これは一番上のリソースグループ(rg-01)を利用するという事を示しています。

サブネットの場合はデプロイ先の仮想ネットワークを  virtual_network_name = azurerm_virtual_network.vnet-01.nameと記載しています。vm.tf内で定義している仮想ネットワーク(vnet-01)指定しています。

Azure VM(仮想マシン)のリソースを定義しています。
OSディスクは仮想マシンのリソース内で定義されます。

OSのイメージの指定ですが、

※Azure VM(仮想マシン)のテンプレートはWindowsとLinuxで異なります。

resource “azurerm_resource_group" “rg-01" {
  name     = “test-rg"
  location = “eastus2"
}

resource “azurerm_virtual_network" “vnet-01" {
  name                = “vnet-01"
  location            = azurerm_resource_group.rg-01.location
  resource_group_name = azurerm_resource_group.rg-01.name
  address_space       = [“10.0.0.0/16"]
  tags                = {}
}

resource “azurerm_subnet" “subnet-01" {
  name                 = “subnet-01"
  resource_group_name  = azurerm_resource_group.rg-01.name
  virtual_network_name = azurerm_virtual_network.vnet-01.name
  address_prefixes     = [“10.0.1.0/24"]
}

resource “azurerm_public_ip" “publicip-01" {
  name                = “pubip-01"
  location            = azurerm_resource_group.rg-01.location
  resource_group_name = azurerm_resource_group.rg-01.name
  allocation_method   = “Dynamic"
  tags                = {}
}

resource “azurerm_network_interface" “test-vm-01-nic" {
  name                = “test-vm-01-nic"
  location            = azurerm_resource_group.rg-01.location
  resource_group_name = azurerm_resource_group.rg-01.name
  ip_configuration {
    name                          = “ipconfig"
    subnet_id                     = azurerm_subnet.subnet-01.id
    private_ip_address_allocation = “Dynamic"
    public_ip_address_id          = azurerm_public_ip.publicip-01.id
  }

  tags = {}
}

resource “azurerm_linux_virtual_machine" “vm-01" {
  name                  = “test-vm-01"
  location              = azurerm_resource_group.rg-01.location
  resource_group_name   = azurerm_resource_group.rg-01.name
  network_interface_ids = [azurerm_network_interface.test-vm-01-nic.id]
  size                  = “Standard_B1ms"

  os_disk {
    name                 = “test-vm-01_OsDisk"
    caching              = “ReadWrite"
    storage_account_type = “Standard_LRS"
  }

  source_image_reference {
    publisher = “OpenLogic"
    offer     = “CentOS"
    sku       = “8_1-gen2"
    version   = “latest"
  }

  computer_name                   = “test-vm-01"
  admin_username                  = “adminuser"
  admin_password                  = “P@$$w0rd1234!"
  disable_password_authentication = false

  tags = {}
}

※Azure VM(Linux)をパスワード認証でデプロイする場合は、disable_password_authentication = falseの追加が必要になります。

Terraformを使ってAzure VM(仮想マシン)をデプロイ

Terraform applyでAzure VM(仮想マシン)をデプロイ

terraform applyでAzure VM(仮想マシン)をデプロイしてみます。
terraform apply実行時に確認メッセージが表示されますので"yes"と入力します。
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.と表示され新規にリソースが6つ作成された事が分かります。

実行結果(抜粋)

PS C:\terraform> terraform apply

+ create

Terraform will perform the following actions:

# azurerm_linux_virtual_machine.vm-01 will be created
+ resource “azurerm_linux_virtual_machine" “vm-01" {
+ admin_password = (sensitive value)
+ admin_username = “adminuser"
+ allow_extension_operations = true
+ computer_name = “test-vm-01"
+ disable_password_authentication = false
+ location = “eastus2"
+ name = “test-vm-01"
+ resource_group_name = “test-rg"
+ size = “Standard_B1ms"

+ os_disk {
+ caching = “ReadWrite"
+ name = “test-vm-01_OsDisk"
+ storage_account_type = “Standard_LRS"
}

+ source_image_reference {
+ offer = “CentOS"
+ publisher = “OpenLogic"
+ sku = “8_1-gen2"
+ version = “latest"
}
}

# azurerm_network_interface.test-vm-01-nic will be created
+ resource “azurerm_network_interface" “test-vm-01-nic" {
+ location = “eastus2"
+ name = “test-vm-01-nic"
+ resource_group_name = “test-rg"

 ip_configuration {

+ name = “ipconfig"
+ private_ip_address_allocation = “dynamic"
+ private_ip_address_version = “IPv4"
}
}

# azurerm_public_ip.publicip-01 will be created
+ resource “azurerm_public_ip" “publicip-01" {
+ allocation_method = “Dynamic"
+ location = “eastus2"
+ name = “pubip-01"
+ resource_group_name = “test-rg"
+ sku = “Basic"
}

# azurerm_resource_group.rg-01 will be created
+ resource “azurerm_resource_group" “rg-01" {
+ location = “eastus2"
+ name = “test-rg"
}

# azurerm_subnet.subnet-01 will be created
+ resource “azurerm_subnet" “subnet-01" {
+ address_prefixes = [
+ “10.0.1.0/24",
]
+ name = “subnet-01"
+ resource_group_name = “test-rg"
+ virtual_network_name = “vnet-01"
}

# azurerm_virtual_network.vnet-01 will be created
+ resource “azurerm_virtual_network" “vnet-01" {
+ address_space = [
+ “10.0.0.0/16",
]
+ location = “eastus2"
+ name = “vnet-01"
+ resource_group_name = “test-rg"
}

Plan: 6 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes’ will be accepted to approve.

Enter a value: yes

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

+ createの部分に作成されるリソースの情報が表示されています。

Azure Portalで作成されたリソースを確認

Azure Portalで作成されたリソースを確認してみます。

Azure Portal
リソースグループを確認すると指定した通りに作成されている事が分かります。
仮想マシンを確認すると指定した通り作成されている事が分かります。

Terraform destroyで作成したリソースを削除

最後にterraform destroyでAzure VM(仮想マシン)を削除します。
terraform destroy実行時に確認メッセージが表示されますので"yes"と入力します。
Destroy complete! Resources: 6 destroyed.と表示されリソースが6つ削除された事が分かります。

実行結果(抜粋)

PS C:\terraform> terraform destroy
– destroy

Terraform will perform the following actions:

# azurerm_linux_virtual_machine.vm-01 will be destroyed
– resource “azurerm_linux_virtual_machine" “vm-01" {
}

# azurerm_network_interface.test-vm-01-nic will be destroyed
– resource “azurerm_network_interface" “test-vm-01-nic" {
}

# azurerm_public_ip.publicip-01 will be destroyed
– resource “azurerm_public_ip" “publicip-01" {
}

# azurerm_resource_group.rg-01 will be destroyed
– resource “azurerm_resource_group" “rg-01" {
}

# azurerm_subnet.subnet-01 will be destroyed
– resource “azurerm_subnet" “subnet-01" {
}

# azurerm_virtual_network.vnet-01 will be destroyed
– resource “azurerm_virtual_network" “vnet-01" {
}

Plan: 0 to add, 0 to change, 6 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes’ will be accepted to confirm.

Enter a value: yes

Destroy complete! Resources: 6 destroyed.

+ createの部分に作成されるリソースの情報が表示されています。

Azure VM(仮想マシン)にNSG(ネットワークセキュリティグループ)を追加

先ほど作成したAzure  VM(仮想マシン)にはNSG(ネットワークセキュリティグループ)が無いため外部からのアクセスが出来ません。
Terraform使ってNSGを追加してみます。

NSGをAzure VM(仮想マシン)に割り当てる為に必要なリソースブロックは2つ

vm.tfにNSGの設定を追加します。
NSGはAzure VM(仮想マシン)のネットワークインターフェースに追加します。
追加するリソースブロックは2つです。

vm.tfの内容(NSG割り当て後)

vm.tfを編集してネットワークインターフェースにNSG割り当てを行います。
追加する場所はvm.tfの中のどこでも問題ありません。

vm.tf(NSG追加部分のみ抜粋)

azurerm_network_security_groupでNSGを規定しています。security_ruleが規則作成部分になります。
directionをInboundとしていますので受信規則となります。

azurerm_network_interface_security_group_associationでネットワークインターフェースにNSGを割り当てています。
割り当てはid指定で行っています。

※NSGをサブネットに割り当てる場合は、azurerm_subnet_network_security_group_associationを使います。

 

resource “azurerm_network_security_group" “nsg-01" {
  name                = “test-vm-01-nsg"
  location            = azurerm_resource_group.rg-01.location
  resource_group_name = azurerm_resource_group.rg-01.name

  security_rule {
    name                       = “rule-01"
    priority                   = 100
    direction                  = “Inbound"
    access                     = “Allow"
    protocol                   = “TCP"
    source_port_range          = “*"
    destination_port_ranges    = [“22"]
    source_address_prefixes    = [“192.168.1.1"]
    destination_address_prefix = “VirtualNetwork"
  }
  tags = {}
}

resource “azurerm_network_interface_security_group_association" “test-vm-01-nic-nsg-01" {
  network_interface_id      = azurerm_network_interface.test-vm-01-nic.id
  network_security_group_id = azurerm_network_security_group.nsg-01.id
}

Terraform applyでNSGをデプロイ

terraform applyでNSGをデプロイしてみます。
terraform apply実行時に確認メッセージが表示されますので"yes"と入力します。
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.と表示されNSGのデプロイが完了した事が分かります。

実行結果(抜粋)

PS C:\terraform> terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# azurerm_network_interface_security_group_association.test-vm-01-nic-nsg-01 will be created
+ resource “azurerm_network_interface_security_group_association" “test-vm-01-nic-nsg-01" {
+ id = (known after apply)
+ network_interface_id = “/subscriptions/サブスクリプションID/resourceGroups/test-rg/providers/Microsoft.Network/networkInterfaces/test-vm-01-nic"
+ network_security_group_id = (known after apply)
}

# azurerm_network_security_group.nsg-01 will be created
+ resource “azurerm_network_security_group" “nsg-01" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “test-vm-01-nsg"
+ resource_group_name = “test-rg"
+ security_rule = [
+ {
+ access = “Allow"
+ description = “"
+ destination_address_prefix = “VirtualNetwork"
+ destination_address_prefixes = []
+ destination_application_security_group_ids = []
+ destination_port_range = “"
+ destination_port_ranges = [
+ “22",
]
+ direction = “Inbound"
+ name = “rule-01"
+ priority = 100
+ protocol = “TCP"
+ source_address_prefix = “"
+ source_address_prefixes = [
+ “192.168.1.1",
]
+ source_application_security_group_ids = []
+ source_port_range = “*"
+ source_port_ranges = []
},
]
}

Plan: 2 to add, 0 to change, 0 to destroy.

Enter a value: yes

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Azure Portalで作成されたリソースを確認

Azure Portalで作成されたリソースを確認してみます。

Azure Portal
仮想マシンのネットワークを見るとNSGが作成されている事が確認出来ます。

最後に

Terraform を使ったAzure VM(仮想マシン)の作成、削除についてやってみました。
Terraformの公式サイトのAzure Providerで各Azureのリソースドキュメントが整備されています。
こちらを活用するとTerraformで簡単にAzure関連のリソースがデプロイはもちろん、作成したリソースの変更も簡単にできる事が分かりました。
今回は1台のAzure VM(仮想マシン)作成のみを行っていますが、変数を使ったりするともっと便利に作成できる事が出来ます。
今後も引き続き色々試してみたいと思います。

変数の使い方やModuleの使い方などTerraform関連の記事はこちらに記載しております。
併せて見て頂けると大変有難いです。

Terraformの記事一覧