【Terraform de Azure】 DevTest Labs に Windows10 VM を作成してみました

### 概要
「Infrastructure as Code」ということで、Terraform を用いて Azure環境上の DevTest Labs に Windows10Pro のVMを作成してみました。 検証・開発・デモ・トレーニング・ハンズオン等に利用できると思います。 [Azure IaaS 上に Windows10Pro を構築したこの記事](https://qiita.com/turupon/items/7c8c409a3ae841854cde)と比較してみてください。


### ローカル環境

- macOS Monterey 12.1
- python 3.8.12
- Azure CLI 2.33.0
- terraform v1.0.11

### 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）
2. ローカル環境に「azure cli」がインストールされていること
3. ローカル環境に「terraform」環境が構成されていること
4. TerraformでAzure上に環境構築するための[サービスプリンシパルが作成](https://qiita.com/turupon/items/5d024d43a60cd101be94)されており、Terraform のためのローカル環境変数が定義されていること

---

## Terraform で DevTest Labs に Windows10 Pro の VM を作成してみる

### terraform 定義ファイルの作成

プロバイダの定義

```main.tf
# プロバイダーの定義
terraform {
  required_providers {
    azurerm =  "~> 2.33"
  }
}

provider "azurerm" {
  features {}
  tenant_id     = var.ARM_TENANT_ID
  client_id     = var.ARM_CLIENT_ID
  client_secret = var.ARM_CLIENT_SECRET
}


# リソースグループ
resource "azurerm_resource_group" "this" {
  name     = var.resource_group_name
  location = var.region
  tags     = var.tags_def
}
```

パラメータ定義ファイル

```variables.tf
# パラメータの定義

# 環境変数（Azureサービスプリンシパル）
variable ARM_TENANT_ID {}
variable ARM_CLIENT_ID {}
variable ARM_CLIENT_SECRET {}

# タグ情報
variable tags_def {
  default = {
    owner      = "ituru"
    period     = "2022-02-28"
    CostCenter = "PSG2"
    Environment = "DevTestDemo"
    Project = "Git_IaC"
  }
}

# 各種パラメータ
variable region {}                  // 利用リージョン
variable resource_group_name {}     // リソースグループ名

variable dev_test_name {}           // DevTestLab名
variable dev_test_vnet_name {}      // DevTestLab の vNet名
variable dev_test_vm_name {}        // DevTestLab の 仮想マシン名
variable vm_size {}                 // 仮想マシンサイズ
variable dt_username {}             // 管理者名
variable dt_password {}             // 管理者パスワード
variable dt_storage_type {}         // ストレージタイプ
```

パラメータ値定義ファイル

```terraform.tfvars
# 環境変数の定義（Azureサービスプリンシパル）
ARM_TENANT_ID       = "zzzzzzzz-cccc-4645-5757-zzzzzzzzzzzz"
ARM_CLIENT_ID       = "xxxxxxxx-xxxx-4444-9922-xxxxxxxxxxxx"
ARM_CLIENT_SECRET   = "hogehogehogehogehogehogehogehogege"

# パラメータ値の定義
region                  = "japaneast"           // 利用リージョン
resource_group_name     = "rg_ituru_dt01"       // リソースグループ名

dev_test_name           = "dt_ituru_lab01"      // DevTestLab名
dev_test_vnet_name      = "vnet_dt_ituru_dt01"  // DevTestLabのvNet名
dev_test_vm_name        = "vm-ituru-win10p"     // DevTestLabの仮想マシン名
vm_size                 = "Standard_D2_v2"      // 仮想マシンサイズ
dt_username             = "dtuser01"            // 管理者名
dt_password             = "Password123!"        // 管理者パスワード
dt_storage_type         = "Premium"             // ストレージタイプ
```

仮想マシン定義ファイル

```devtest.tf
# DevTest Labs の定義
resource "azurerm_dev_test_lab" "this" {
  name                  = var.dev_test_name
  location              = azurerm_resource_group.this.location
  resource_group_name   = azurerm_resource_group.this.name
  tags                  = var.tags_def
}

# DevTest ネットワークの定義
resource "azurerm_dev_test_virtual_network" "this" {
  name                = var.dev_test_vnet_name
  lab_name            = azurerm_dev_test_lab.this.name
  resource_group_name = azurerm_resource_group.this.name

  subnet {
    use_public_ip_address           = "Allow"
    use_in_virtual_machine_creation = "Allow"
  }
}

# DevTest 仮想マシンの定義
resource "azurerm_dev_test_windows_virtual_machine" "this" {
  name                   = var.dev_test_vm_name
  lab_name               = azurerm_dev_test_lab.this.name
  resource_group_name    = azurerm_resource_group.this.name
  location               = azurerm_resource_group.this.location
  size                   = var.vm_size
  username               = var.dt_username
  password               = var.dt_password
  lab_virtual_network_id = azurerm_dev_test_virtual_network.this.id
  lab_subnet_name        = azurerm_dev_test_virtual_network.this.subnet[0].name
  storage_type           = var.dt_storage_type
  notes                  = "Managed by Terraform......."

  gallery_image_reference {
    offer     = "Windows-10"
    publisher = "MicrosoftWindowsDesktop"
    sku       = "win10-21h2-pro"
    version   = "latest"
  }
}
```

### terraform の実行

```
## init
$ terraform init
    :
Terraform has been successfully initialized!

## plan
$ terraform plan
    :
Plan: 4 to add, 0 to change, 0 to destroy.

## apply
$ terraform apply
    :
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

   ※完了まで20分程かかりました、、、、
```

### ローカルの作業ディレクトの状況

```
$ tree -a
.
├── .terraform
│   └── providers
│       └── registry.terraform.io
│           └── hashicorp
│               └── azurerm
│                   └── 2.95.0
│                       └── darwin_amd64
│                           └── terraform-provider-azurerm_v2.95.0_x5
├── .terraform.lock.hcl
├── devtest.tf
├── main.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── terraform.tfvars
└── variables.tf
```

---

## terraform 実行後の確認

### リソースグループ の確認

```
$ az group show --name rg_ituru_dt01
{
  "id": "/subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourceGroups/rg_ituru_dt01",
  "location": "japaneast",
  "managedBy": null,
  "name": "rg_ituru_dt01",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": {
    "CostCenter": "PSG2",
    "Environment": "DevTestDemo",
    "Project": "Git_IaC",
    "owner": "ituru",
    "period": "2022-02-28"
  },
  "type": "Microsoft.Resources/resourceGroups"
}
```

### DevTest Labs の確認

```
$ az lab get --name dt_ituru_lab01 --resource-group rg_ituru_dt01 --output table
Command group 'lab' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus

ArtifactsStorageAccount                                                                                                                         CreatedDate                       DefaultPremiumStorageAccount                                                                                                                    DefaultStorageAccount                                                                                                                           EnvironmentPermission    LabStorageType    Location    Name            PremiumDataDiskStorageAccount                                                                                                                   PremiumDataDisks    ProvisioningState    ResourceGroup    UniqueIdentifier                      VaultName
----------------------------------------------------------------------------------------------------------------------------------------------  --------------------------------  ----------------------------------------------------------------------------------------------------------------------------------------------  ----------------------------------------------------------------------------------------------------------------------------------------------  -----------------------  ----------------  ----------  --------------  ----------------------------------------------------------------------------------------------------------------------------------------------  ------------------  -------------------  ---------------  ------------------------------------  -------------------------------------------------------------------------------------------------------------------------------------
/subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourcegroups/rg_ituru_dt01/providers/microsoft.storage/storageaccounts/adtiturulab013224  2022-02-13T15:52:41.153303+00:00  /subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourcegroups/rg_ituru_dt01/providers/microsoft.storage/storageaccounts/adtiturulab013224  /subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourcegroups/rg_ituru_dt01/providers/microsoft.storage/storageaccounts/adtiturulab013224  Reader                   Premium           japaneast   dt_ituru_lab01  /subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourcegroups/rg_ituru_dt01/providers/microsoft.storage/storageaccounts/adtiturulab013224  Disabled            Succeeded            rg_ituru_dt01    e10277f9-c015-4e9d-9577-96e1e3409577  /subscriptions/xxxxxxxx-1717-dada-9779-zzzzzzzzzzzz/resourcegroups/rg_ituru_dt01/providers/microsoft.keyvault/vaults/dtiturulab015486

```

### 仮想マシンの確認

```
## list で VM一覧 を取得を試みましたが、、、、NG
$ az lab vm list --lab-name dt_ituru_lab01 --resource-group rg_ituru_dt01
Command group 'lab' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
[]

## なので、直接VM名を指定して情報を取得してみました、、、
$ az lab vm show --lab-name dt_ituru_lab01 --resource-group rg_ituru_dt01 --name vm-ituru-win10p --expand 'properties($expand=artifacts,computeVm,networkInterface,applicableSchedule)' --query '{status: computeVm.statuses[1].displayStatus, fqdn: fqdn, ipAddress: networkInterface.publicIpAddress}'
Command group 'lab' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{
  "fqdn": "vm-ituru-win10p.japaneast.cloudapp.azure.com",
  "ipAddress": null,
  "status": "VM deallocated"
}
```

### 仮想マシンの起動

```
$ az lab vm start --lab-name dt_ituru_lab01 --resource-group rg_ituru_dt01 --name vm-ituru-win10p

   ※起動に約4分程かかりました、、、、
```

### 仮想マシンの再確認

```
$ az lab vm show --lab-name dt_ituru_lab01 --resource-group rg_ituru_dt01 --name vm-ituru-win10p --expand 'properties($expand=artifacts,computeVm,networkInterface,applicableSchedule)' --query '{status: computeVm.statuses[1].displayStatus, fqdn: fqdn, ipAddress: networkInterface.publicIpAddress}'
Command group 'lab' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{
  "fqdn": "vm-ituru-win10p.japaneast.cloudapp.azure.com",
  "ipAddress": "20.210.103.48",
  "status": "VM running"
}
```

### 仮想マシンの停止

```
$ az lab vm stop --lab-name dt_ituru_lab01 --resource-group rg_ituru_dt01 --name vm-ituru-win10p

   ※停止に約3分程かかりました、、、、
```


### terraform ステートの参照

```
$ terraform state list                                    
azurerm_dev_test_lab.this
azurerm_dev_test_virtual_network.this
azurerm_dev_test_windows_virtual_machine.this
azurerm_resource_group.this
```

### terraform による特定リソースの削除

```
$ terraform destroy -target=azurerm_dev_test_windows_virtual_machine.this
      ：
Destroy complete! Resources: 1 destroyed.
```

### terraform による作成した全リソースの削除

```
$ terraform destroy
      ：
Destroy complete! Resources: 4 destroyed.

   ※完了まで12分程かかりました、、、、
```

---

### まとめ

これで、Terraform でサクッと Azure DevTest Labs 環境を構成できることを確認できました。今回は Windows10Pro のOSのみの環境ですが、ここに各種アプリケーションをインストールされた状態で利用できるようにしたいです、、、、、

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Check! Azure DevTest Labs で、使いたいときだけコストの範囲内で安心して開発してみる](https://qiita.com/dz_/items/0ed9e8b81230e9c96070)
[Azure DevTest Labs と Azure Lab Services を比較する](https://docs.microsoft.com/ja-jp/azure/devtest-labs/lab-services-overview)