【Terraform de Azure】 Windows10 VM に Extention して アプリをインストールしてみました

### 概要
「Infrastructer as Code」ということで、Terraform を用いて Azure環境上に Windows10Pro のVMを作成し、そこに必要なアプリケーションをインストールしてみました。


### ローカル環境

- 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 のためのローカル環境変数が定義されていること
5. アプリのインストーラ・インストールスクリプト ファイル等を保存しておくストレージアカウントとコンテナを作成しておきます。

## 構成内容

[この記事](https://qiita.com/turupon/items/7c8c409a3ae841854cde)の Terraform 定義ファイルを利用します

### インストーラーの準備

対象とするアプリケーションのインストーラーを準備します

   - Git : Git-2.35.1.2-64-bit.exe
   - Azure CLI : azure-cli-2.33.1.msi
   - VSCode : VSCodeUserSetup-x64-1.64.2.exe

上記アプリをインストールするための PowerShellスクリプトファイル「init_app.ps1」を作成します。

```init_app.ps1
msiexec.exe /i .\azure-cli-2.33.1.msi /passive
.\Git-2.35.1.2-64-bit.exe /VERYSILENT
.\VSCodeUserSetup-x64-1.64.2.exe /VERYSILENT
```

### BLOBへのアップロード

事前に作成したコンテナ情報を取得します。

```
$ az storage container list --account-name iturutfstate --output table

Name     Lease Status    Last Modified
-------  --------------  -------------------------
app                      2022-02-16T07:25:53+00:00
tfstate                  2021-12-04T16:12:31+00:00
```

app コンテナへ、インストーラとスクリプトファイルをアップロードし、それらのファイルを確認します。

```
$ az storage blob list --account-name iturutfstate --container-name app --output table

Name                            Blob Type    Blob Tier    Length    Content Type              Last Modified              Snapshot
------------------------------  -----------  -----------  --------  ------------------------  -------------------------  ----------
Git-2.35.1.2-64-bit.exe         BlockBlob    Hot          50244992  application/x-msdownload  2022-02-16T07:26:22+00:00
VSCodeUserSetup-x64-1.64.2.exe  BlockBlob    Hot          77256912  application/x-msdownload  2022-02-16T07:26:34+00:00
azure-cli-2.33.1.msi            BlockBlob    Hot          54448128  application/octet-stream  2022-02-16T07:26:35+00:00
init_app.ps1                    BlockBlob    Hot          131       application/octet-stream  2022-02-16T07:47:10+00:00
```

### terraform 定義ファイルの編集

仮想マシン定義ファイル「computer.tf」を編集します（「仮想マシンの機能拡張」以降が追加部分）

```computer.tf
# windows10 仮想マシン
resource "azurerm_windows_virtual_machine" "this" {
  name                  = var.vm_name
  location              = azurerm_resource_group.this.location
  resource_group_name   = azurerm_resource_group.this.name
  size                  = var.vm_size
  computer_name         = var.computer_name
  admin_username        = var.admin_username
  admin_password        = var.admin_password
  network_interface_ids = [
    azurerm_network_interface.this.id,
  ]

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

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

  tags  = var.tags_def
}


# 仮想マシンの機能拡張（アプリのインストール）
resource "azurerm_virtual_machine_extension" "git" {
  name                  = azurerm_windows_virtual_machine.this.name
  virtual_machine_id    = azurerm_windows_virtual_machine.this.id
  publisher             = "Microsoft.Compute"
  type                  = "CustomScriptExtension"
  type_handler_version  = "1.9"
  tags                  = var.tags_def

  # VMにダウンロードするファイル(準備したファイルのフルパス)と実行するPowershellを設定
  settings = <<SETTINGS
  {
      "fileUris": [
          "https://iturutfstate.blob.core.windows.net/app/init_app.ps1",
          "https://iturutfstate.blob.core.windows.net/app/azure-cli-2.33.1.msi",
          "https://iturutfstate.blob.core.windows.net/app/Git-2.35.1.2-64-bit.exe",
          "https://iturutfstate.blob.core.windows.net/app/VSCodeUserSetup-x64-1.64.2.exe"
      ],
      "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File \"init_app.ps1\""
  }
  SETTINGS
}
```

### terraform の実行

```
$ terraform plan
$ terraform apply
```

---

### 仮想マシンへ接続しての確認

#### RDP接続

仮想マシンへの RDP接続については、[この記事](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/connect-logon) を参考にして実施ください。

#### 接続（ログイン）後の確認

コンソール（PowerShell）を立ち上げ、アプリケーションがインストールされていることを確認します。

```
## Git アプリケーション
PS C:\Users\adminuser> Get-ItemProperty HKLM:Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

DisplayName DisplayVersion Publisher                     InstallDate
----------- -------------- ---------                     -----------
Git         2.35.1.2       The Git Development Community 20220216


## Azure CLI アプリケーション
PS C:\Users\adminuser> Get-ItemProperty HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

DisplayName           DisplayVersion Publisher             InstallDate
-----------           -------------- ---------             -----------
Microsoft Edge        98.0.1108.50   Microsoft Corporation 20220216
Microsoft Edge Update 1.3.155.77
Microsoft Azure CLI   2.33.1         Microsoft Corporation 20220216


## VSCode アプリケーション
PS C:\Users\adminuser> Get-ItemProperty HKCU:Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

DisplayName                         DisplayVersion   Publisher             InstallDate
-----------                         --------------   ---------             -----------
Microsoft OneDrive                  21.220.1024.0005 Microsoft Corporation
Microsoft Visual Studio Code (User) 1.64.2           Microsoft Corporation 20220216
```

機能拡張で実行されたファイルのありかは以下となります

```
    Directory: C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.9.5\downloads\0

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2/16/2022   3:08 PM       54448128 azure-cli-2.33.1.msi
-a----         2/16/2022   3:08 PM       50244992 Git-2.35.1.2-64-bit.exe
-a----         2/16/2022   3:08 PM            131 init_app.ps1
-a----         2/16/2022   3:08 PM       77256912 VSCodeUserSetup-x64-1.64.2.exe
```

---

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

```
$ terraform destroy
```

---

### まとめ

これで、Terraform でサクッと Azure環境上の Windows10Pro にアプリケーションをインストールする方法を確認することができました。 DevTest Labs でも同様なことをやってみようかと、、、、

### 参考記事

以下の記事をおもいっきり参考にさせていただきました。感謝申し上げます。
[[Azure] TerraformでのWindows OS設定(Custom Script Extension)記法メモ](https://qiita.com/VA_nakatsu/items/39a958c464fa01b344f8)