Azure環境でTerraformを使ってみる(2/2)

# はじめに
[「Azure環境でTerraformを使ってみる(1/2)」](https://qiita.com/nosecape/items/52b3333cc91e429b91de)の続きです。

初めてterraformを使う方かつAzureで試してみたい方向けにやり方をまとめました。

# 概要
前回はネットワークを作成したので今回はVMを作成しネットワークに配置したいと思います。



# 構成図
最終的な構成図です。
二つのサブネットを含むVNETと3枚のNWインターフェースを持つVMを1台作成します

![概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516565/42992302-390e-8461-7836-47f799d7ed92.png)

# 作業の流れ
1. (前回の記事）ネットワークを作成するコードを準備
1. (前回の記事）terraformの環境を準備
1. (前回の記事）terraformを実行
1. VMを作成するコードを準備
1. terraformを実行



# 手順

**4.VMを作成するコードを準備**
1. Networkのコードを準備した時と同じようにVMを作成するコードを準備します
丸ごとコピーしてローカルPCのメモ帳などで作成し保存して下さい
VM、パブリックIP、ネットワークインターフェースを作成するコードを作成します
vm.tfのos_profile の部分は**必ず**適当に書き換えて下さい。
ユーザー名はadminなどでもよいのですが、パスワードは複雑なものにしておかないとterraformでリソースを作成中にエラーが発生して失敗します
（やり直して手間取るのが嫌な方は難しくしておいてください）
```
        admin_username = "username"
        admin_password = "password"
```
```vm.tf
###############################
# vm00を作成
###############################
# パブリックIPアドレスを作成
resource "azurerm_public_ip" "vm00_publicip" {
    name                         = "vm00_PublicIP"
    location                     = "Japan East"
    resource_group_name          = "${azurerm_resource_group.ec_group.name}"
    allocation_method            = "Dynamic"
}

# ネットワークインターフェース1を作成
resource "azurerm_network_interface" "vm00_BKnic" {
    name                      = "vm00_NIC01"
    location                  = "Japan East"
    resource_group_name       = "${azurerm_resource_group.ec_group.name}"

    ip_configuration {
        name                          = "vm00_NIC01Configuration"
        subnet_id                     = "${azurerm_subnet.ec_BKsubnet.id}"
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = "${azurerm_public_ip.vm00_publicip.id}"
    }
}

# ネットワークインターフェース1にセキュリティーグループを紐付ける
resource "azurerm_network_interface_security_group_association" "assoc00" {
  network_interface_id      = azurerm_network_interface.vm00_BKnic.id
  network_security_group_id = azurerm_network_security_group.eclinux_nsg.id
}

# ネットワークインターフェース2を作成
resource "azurerm_network_interface" "vm00_FR01nic" {
    name                      = "vm00_NIC02"
    location                  = "Japan East"
    resource_group_name       = "${azurerm_resource_group.ec_group.name}"

    ip_configuration {
        name                          = "vm00_NIC02Configuration"
        subnet_id                     = "${azurerm_subnet.ec_FRsubnet.id}"
        private_ip_address_allocation = "Dynamic"
    }
}

# ネットワークインターフェース2にセキュリティーグループを紐付ける
resource "azurerm_network_interface_security_group_association" "assoc01" {
  network_interface_id      = azurerm_network_interface.vm00_FR01nic.id
  network_security_group_id = azurerm_network_security_group.eclinux_nsg.id
}

# ネットワークインターフェース3を作成
resource "azurerm_network_interface" "vm00_FR02nic" {
    name                      = "vm00_NIC03"
    location                  = "Japan East"
    resource_group_name       = "${azurerm_resource_group.ec_group.name}"

    ip_configuration {
        name                          = "vm00_NIC03Configuration"
        subnet_id                     = "${azurerm_subnet.ec_FRsubnet.id}"
        private_ip_address_allocation = "Dynamic"
    }
}


# 仮想サーバーの作成
resource "azurerm_virtual_machine" "vm00" {
    name                  = "vm00"
    location              = "Japan East"
    resource_group_name   = "${azurerm_resource_group.ec_group.name}"
    network_interface_ids = ["${azurerm_network_interface.vm00_BKnic.id}","${azurerm_network_interface.vm00_FR01nic.id}","${azurerm_network_interface.vm00_FR02nic.id}"]
    primary_network_interface_id="${azurerm_network_interface.vm00_BKnic.id}"
 
    vm_size               = "Standard_B2s"
    
    storage_os_disk {
        name              = "vm00_OsDisk"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Premium_LRS"
    }

    storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy-daily"
        sku       = "22_04-daily-lts"
        version   = "latest"
    }

    os_profile {
        computer_name  = "vm00"
        admin_username = "*****"
        admin_password = "*****"
    }
    
    os_profile_linux_config {
        disable_password_authentication = false
    }
}

```

**5.terraformを実行**

1. ローカルに作成したvm.tfファイルをコンソールにドラック&ドロップする
&ensp;lsを実行してファイルがアップロードされたことを確認する
```
nosecape@Azure:~$ ls
clouddrive  network.tf  terraform.tfstate  terraform.tfstate.backup  vm.tf
nosecape@Azure:~$ 
```
&ensp;2. terraform planを実行します
```
nosecape@Azure:~$ terraform plan
azurerm_resource_group.ec_group: Refreshing state... [id=/subscriptions/xxx/resourceGroups/education_env]
          　　　　　　　　　　・      　　　　　　　　　　 
          　　　　　　　　　　・
　　　　　　　　　　 　　　　<省略>
          　　　　　　　　　　・
          　　　　　　　　　　・
```
&ensp;5. terraform applyを実行します（リソースの作成を行います）
```
nosecape@Azure:~$ 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.ecvm00_BKnic will be created
  + resource "azurerm_network_interface" "ecvm00_BKnic" {
      + applied_dns_servers           = (known after apply)
      + dns_servers                   = (known after apply)
      + enable_accelerated_networking = false
      + enable_ip_forwarding          = false
      + id                            = (known after apply)
      + internal_dns_name_label       = (known after apply)
      + internal_domain_name_suffix   = (known after apply)
          　　　　　　　　　　・
          　　　　　　　　　　・
　　　　　　　　　　 　　　　<省略>
          　　　　　　　　　　・
          　　　　　　　　　　・
      + storage_os_disk {
          + caching                   = "ReadWrite"
          + create_option             = "FromImage"
          + disk_size_gb              = (known after apply)
          + managed_disk_id           = (known after apply)
          + managed_disk_type         = "Premium_LRS"
          + name                      = "ecvm00_OsDisk"
          + os_type                   = (known after apply)
          + write_accelerator_enabled = false
        }
    }

Plan: 7 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.
```
&ensp;6. Enter a value と出てくるのでyesと入力します
```
  Enter a value: yes

azurerm_network_interface.ecvm00_FE02nic: Creating...
azurerm_network_interface.ecvm00_FE01nic: Creating...
azurerm_public_ip.ecvm00_publicip: Creating...
azurerm_network_interface.ecvm00_FE02nic: Creation complete after 3s 
          　　　　　　　　　　・
          　　　　　　　　　　・
　　　　　　　　　　 　　　　<省略>
          　　　　　　　　　　・
          　　　　　　　　　　・
azurerm_virtual_machine.ecvm00: Still creating... [6m20s elapsed]
azurerm_virtual_machine.ecvm00: Creation complete  [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Compute/virtualMachines/ecvm00]

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.
nosecape@Azure:~$ 
```
&ensp;これでリソースが出来上がりました。

&ensp;確認していきましょう。
　　
&ensp;7.リソースグループを見てみます
&ensp;VMやネットワークインターフェイスなどが作成されています
![vm02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516565/8937f84d-5739-fe51-c5f6-a962da83d704.png)

&ensp;8.　VMを見てみます
![vm03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516565/363c9849-feb0-26be-c54d-8d3df744d5f2.png)

&ensp;これで予定のリソース作成が完成しました

# 最後に
思った以上に準備も含めて構築が簡単にできたと思います
ぜひ効率化のために使いましょう

# おまけ
1 VMにNICを複数枚付けた特殊な構成にしたことにあまり意味はありません。
2 環境を消す場合はterraform destroyコマンドを実行します
```
nosecape@Azure:~$ terraform destroy
azurerm_resource_group.ec_group: Refreshing state... [id=/subscriptions/xxxx/resourceGroups/education_env]
azurerm_virtual_network.ec_network: Refreshing state... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/virtualNetworks/EducationNetwork]
          　　　　　　　　　　・
          　　　　　　　　　　・
　　　　　　　　　　 　　　　<省略>
          　　　　　　　　　　・
          　　　　　　　　　　・
Plan: 0 to add, 0 to change, 13 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
          　　　　　　　　　　・
          　　　　　　　　　　・
　　　　　　　　　　 　　　　<省略>
          　　　　　　　　　　・
          　　　　　　　　　　・
azurerm_network_interface_security_group_association.example000: Destroying... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkInterfaces/edvm00_NIC01|/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkSecurityGroups/SSHNetworkSecurityGroup]
azurerm_network_interface_security_group_association.assoc01: Destroying... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkInterfaces/edvm00_NIC02|/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkSecurityGroups/SSHNetworkSecurityGroup]


Destroy complete! Resources: 13 destroyed.
nosecape@Azure:~$ 
```