Terraform@Azure – 3:参照の利用(仮想ネットワークと仮想マシンのデプロイ)

参照について

  • 仮想ネットワークにリソースグループの情報を渡したり、サブネットに仮想ネットワークの情報を渡したりする必要がある
  • コードから値にアクセスできるようにするために参照(reference)を使用する
<PROVIDER>_<TYEP>.<NAME>.<ATTRIBUTE>
  • PROVIDER
    • プロバイダ名
  • TYPE
    • リソースの種類
  • NAME
    • リソースの名前(自分がコードの中で利用する用に設定した名前)
  • ATTRIBUTE
    • リソースの引数か、リソースによってエクスポートされた属性のいずれか
  • あるリソースから他のリソースへ参照を追加すると、暗黙的依存(implicit dependency)が設定される
  • Terraformはこれらの依存を構造分析し、そこから依存グラフを作成し、リソースをどの順番で作成すべきか自動的に判断するためにそのグラフを使用する
  • graphコマンドを実行することで、Terraformにこの依存グラフを表示させることも可能
    • 後述を参照

VNetのデプロイ

  • サブネットは仮想ネットワークのリソース宣言の中に書くか、独立したリソースとして書くか、あらかじめ決めておいた方が良さそうです

Terraform は現在、スタンドアロンのサブネット リソースと、仮想ネットワーク リソース内でサブネットをインラインで定義できるようにします。現時点では、インライン サブネットを持つ仮想ネットワークをサブネット リソースと組み合わせて使用​​することはできません。これを行うと、サブネット構成の競合が発生し、サブネットが上書きされます。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network
  • DNSも同様に、仮想ネットワークのリソース宣言の中に書くか、独立したリソースとして書くか、あらかじめ決めておいた方が良さそうです

Terraform は現在、スタンドアロンの仮想ネットワーク DNS サーバー リソースと、仮想ネットワーク リソース内で DNS サーバーをインラインで定義できるようにします。現時点では、インライン DNS サーバーを備えた仮想ネットワークを仮想ネットワーク DNS サーバー リソースと組み合わせて使用​​することはできません。これを行うと、仮想ネットワーク DNS サーバー構成の競合が発生し、仮想ネットワーク DNS サーバーが上書きされます。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network

以下は、Terraformのドキュメントからコードを引用

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network
  • 仮想ネットワークが、リージョンやリソースグループ名を参照しています。サブネットがリソースグループ名や仮想ネットワーク名を参照しています
resource "azurerm_virtual_network" "example" {

name = "example-vnet"

address_space = ["10.0.0.0/16"]

location = azurerm_resource_group.example.location

resource_group_name = azurerm_resource_group.example.name

}

resource "azurerm_subnet" "example" {

name = "example-subnet"

resource_group_name = azurerm_resource_group.example.name

virtual_network_name = azurerm_virtual_network.example.name

address_prefixes = ["10.0.1.0/24"]

delegation {

name = "delegation"

service_delegation {

name = "Microsoft.ContainerInstance/containerGroups"

actions = ["Microsoft.Network/virtualNetworks/subnets/join/action", "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action"]

}

}

}

resource "azurerm_network_security_group" "example" {

name = "example-security-group"

location = azurerm_resource_group.example.location

resource_group_name = azurerm_resource_group.example.name

}

仮想マシンのデプロイ

  • 今後は、「azurerm_linux_virtual_machine」もしくは「azurerm_windows_virtual_machine」を使った方が良いとのことです

The azurerm_virtual_machine resource has been superseded by the azurerm_linux_virtual_machine and azurerm_windows_virtual_machine resources. The existing azurerm_virtual_machine resource will continue to be available throughout the 3.x releases however is in a feature-frozen state to maintain compatibility – new functionality will instead be added to the azurerm_linux_virtual_machine and azurerm_windows_virtual_machine resources.

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_machine

以下は、Terraformのドキュメントからコードを引用

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/windows_virtual_machine
  • NICがサブネットIDを参照しています
  • 仮想マシンがリソースグループ名やリソースグループのリージョンを参照しています
resource "azurerm_network_interface" "example" {

name = "example-nic"

location = azurerm_resource_group.example.location

resource_group_name = azurerm_resource_group.example.name

ip_configuration {

name = "internal"

subnet_id = azurerm_subnet.example.id

private_ip_address_allocation = "Dynamic"

}

}

resource "azurerm_windows_virtual_machine" "example" {

name = "example-machine"

resource_group_name = azurerm_resource_group.example.name

location = azurerm_resource_group.example.location

size = "Standard_F2"

admin_username = "adminuser"

admin_password = "P@$$w0rd1234!"

network_interface_ids = [

azurerm_network_interface.example.id,

]

os_disk {

caching = "ReadWrite"

storage_account_type = "Standard_LRS"

}

source_image_reference {

publisher = "MicrosoftWindowsServer"

offer = "WindowsServer"

sku = "2016-Datacenter"

version = "latest"

}

}

実際のコード

  • 参照を活用して、前回から下記のように仮想ネットワーク、仮想マシンを作成するコードを追加しました
provider "azurerm" {
  features {}
  subscription_id = xxxxx
  client_id       = xxxxx
  client_secret   = xxxxx
  tenant_id       = xxxxx
}

resource "azurerm_resource_group" "rg-tf" {
  name = "rg.tf"
  location = "Japaneast"

    tags = {
    environment = "Staging"
  }
}

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

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

resource "azurerm_network_security_group" "nsg-01" {
  name                = "nsg-01"
  location            = azurerm_resource_group.rg-tf.location
  resource_group_name = azurerm_resource_group.rg-tf.name
}

resource "azurerm_network_interface" "nic-vm-winsrv2022" {
  name                = "nic-vm-winsrv2022"
  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                = "vm-winsrv2022"
  resource_group_name = azurerm_resource_group.rg-tf.name
  location            = azurerm_resource_group.rg-tf.location
  size                = "Standard_A1"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  network_interface_ids = [
    azurerm_network_interface.nic-vm-winsrv2022.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2022-Datacenter"
    version   = "latest"
  }
}

依存グラフの出力

  • 下記サイトでグラフを出力することができる
  • terraform graphコマンドで出力されたものをコピペすれば良い

https://bit.ly/2mPbxmg

  • 今回のコードでは下記のようなグラフとなる

リソースのデプロイ

  • 最後にリソースをデプロイし、仮想ネットワークと仮想マシンをTerraformで作成する
$ terraform apply

Terraform will perform the following actions:

# azurerm_network_interface.nic-vm-winsrv2022 will be created

〜〜〜〜〜〜

# azurerm_network_security_group.sg-01 will be created

〜〜〜〜〜〜

# azurerm_subnet.subnet-01 will be created

〜〜〜〜〜〜

# azurerm_virtual_network.vnet-01 will be created

〜〜〜〜〜〜

# azurerm_windows_virtual_machine.vm-winsrv2022 will be created

〜〜〜〜〜〜

Plan: 5 to add, 0 to change, 0 to destroy.
  • 無事に仮想ネットワークと仮想マシンが作成できました

コメントを残す

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

CAPTCHA