【Azure】AzurePowerShellスクリプトを使用してAzure VMの確認、作成、削除をする。

# 1. はじめに
### 1-1 ご挨拶
初めまして、井村と申します。
久しぶりにPowerShellで何かしたくmslearnを漁り、スクリプトを作成しようと決めました。「powershell」をキーワードとして、チェックボックスで「初級」、「ラーニングパス」を選ぶと[1つヒット](https://learn.microsoft.com/ja-jp/training/paths/powershell/)しました。とりあえず、ほぼこの知識だけで何か作成しようと考えた結果、件名の通りとなりました。

![mslearn.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/f19f64da-3481-a332-67b6-9a9bfc6f493c.png)

### 1-2 対象読者
- Azureに興味がある
- PowerShellに興味がる

### 1-3 ローカル環境について
私はWindows端末に以下をインストールました。
- [最新のPowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2)
- [Az PowerShell モジュール](https://learn.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-8.3.0)
- [Visual Studio Code](https://code.visualstudio.com/)

# 2. スクリプトの中身
### 2-1 作成したスクリプト
今回作成したスクリプトは以下になります。

<details><summary>vm.ps1</summary>

```powershell:vm.ps1

     1  Write-Host "What do you want to do? `r`n 1. Show virtual machines. `r`n 2. Create virtual machines. `r`n 3. Delete virtual machine."        
     2
     3  $action = Read-Host -Prompt "Please select number"
     4
     5  # Login Azure
     6  if (($action -eq 1) -or ($action -eq 2) -or ($action -eq 3)) {    
     7      Connect-AzAccount
     8  } else {
     9      Write-Host "Good bye"
    10      exit
    11  }
    12
    13  # 1. Show virtual machines.
    14  if ($action -eq 1)
    15  {
    16      # Verify the virtual machines
    17      Get-AzVM | Format-Table
    18
    19  # 2. Create virtual machines.
    20  } elseif ($action -eq 2) {
    21      Write-Host "Please select resource group. `r`n 1. Create new resource group. `r`n 2. Select existing resource group."
    22
    23      # Select resource group
    24      $ResourceGroupName = Read-Host -Prompt "Please select number" 
    25      if ($ResourceGroupName -eq 1){
    26          $ResourceGroupName = Read-Host -Prompt "Please new resource group name"
    27          New-AzResourceGroup -Name $ResourceGroupName -Location "japaneast"
    28
    29      } elseif ($ResourceGroupName -eq 2) {
    30          Get-AzResourceGroup | Format-Table
    31          $ResourceGroupName = Read-Host -Prompt "Select ResourceGroupName"
    32
    33      } else {
    34          Write-Output "Good bye"
    35          exit
    36      }
    37
    38      # Create virtual machine.
    39      Write-Host "Please select OS. `r`n 1. Windows `r`n 2. Linux"  
    40
    41      $OS = Read-Host -Prompt "Please select number"
    42      $VmNamePre = Read-Host -Prompt "Please Virtual machine name"  
    43
    44      Write-Host "How many virtual machines do you want to create?( 
1 or 2 or 3)"
    45      $HowMany = Read-Host -Prompt "Please select number"
    46
    47      if (($HowMany -eq 1) -or ($HowMany -eq 2) -or ($HowMany -eq 3)) {
    48          if ($OS -eq 1){
    49              $cred = Get-Credential
    50              For ($i = 1; $i -le $HowMany; $i++)
    51                  {
    52                      $VmName = $VmNamePre + $i
    53                      New-AzVm `
    54                      -ResourceGroupName $ResourceGroupName `       
    55                      -Name $VmName `
    56                      -Location "japaneast" `
    57                      -Image "MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition-smalldisk:latest" `
    58                      -Size "Standard_B1s" `
    59                      -Credential $cred
    60                  }
    61          } elseif ($OS -eq 2) {
    62              $cred = Get-Credential
    63              For ($i = 1; $i -le $HowMany; $i++)
    64                  {
    65                      $VmName = $VmNamePre + $i
    66                      New-AzVm `
    67                      -ResourceGroupName $ResourceGroupName `       
    68                      -Name $VmName `
    69                      -Location "japaneast" `
    70                      -Image Debian `
    71                      -size "Standard_B1s" `
    72                      -Credential $cred
    73                  }
    74          } else {
    75              Write-Output "Good bye"
    76              exit
    77          }
    78      } else {
    79          Write-Host "Good bye"
    80          exit
    81      }
    82  # 3. Delete virtual machine.
    83  } elseif ($action -eq 3) {
    84      # Verify the virtual machines
    85      Get-AzVM | Format-Table
    86
    87      Write-Host "Please select the virtual machine you want to delete."
    88      $VmName = Read-Host -Prompt "virtual machine name"
    89
    90      # Get information of the virtual machine.
    91      $vm = Get-AzVM -Name $VmName
    92
    93      # Shut down the virtual machine.
    94      Stop-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force
    95
    96      # Delete the virtual machine.
    97      Remove-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force
    98
    99      # Delete the network interface.
   100      $vm | Remove-AzNetworkInterface -Force
   101
   102      # Delete the managed OS disks and storage account.
   103      Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName 
$vm.StorageProfile.OSDisk.Name | Remove-AzDisk -Force
   104
   105      # Delete the virtual network
   106      Get-AzVirtualNetwork -ResourceGroupName $vm.ResourceGroupName 
| Remove-AzVirtualNetwork -Force
   107
   108      # Delete the network security group
   109      Get-AzNetworkSecurityGroup -ResourceGroupName $vm.ResourceGroupName | Remove-AzNetworkSecurityGroup -Force
   110
   111
   112  } else {
   113      Write-Host "Good bye"
   114      exit
   115  }


```
</details>

大枠の解説となります。「Write-Host」コマンドレットはコンソールにコメントを出力します。「Read-Host」コマンドレットはユーザからの入力を情報を取得します。その情報は左辺の変数に渡し利用します。
1行目の「Write-Host」にてユーザが「1.VM一覧情報取得、2.VM作成、3.VM削除」からどの処理を実施したいか確認します。
3行目の「Read-Host」にてユーザが選択した数字を変数「action」に渡します。
6行目のif分にて変数「action」が1、2、3のいずれかの場合、「Connect-AzAccount」を利用してAzureへログインします。1、2、3以外の値を入力した場合はスクリプト終了です。
14行目のifにて変数「action」が1の場合、vm一覧情報取得を取得して、スクリプトが終了します。
20行目のifにて変数「action」が2の場合、VM作成処理に入ります。vmを作成後、スクリプトが終了します。
83行目のifにて変数「action」が3の場合、VM削除処理に入ります。vmを削除後、スクリプトが終了します。

次章で各処理の動作確認します。

# 3. スクリプトの実行
PowerShellスクリプトの作り方はお気に入りのテキストエディタでファイルを起動します。ファイル名は任意、拡張子を「.ps1」として保存します。スクリプト実行はPowerShellの場合、スクリプトファイルと同じフォルダへ移動後、「.\vm.ps1」と入力しEnterキーで実行できます。
テキストエディタを利用されない方は、PowerShellにて「New-Item hogehoge.ps1」で新規ファイル作成、「code hogehoge.ps1」でファイルを開くことが出来ます。

### 3-1 VM一覧情報取得
スクリプト起動後、以下作業要求コメントがコンソール上に出力されます。VM一覧情報を取得するため、1を入力します。

```
What do you want to do? 
 1. Show virtual machines.
 2. Create virtual machines.
 3. Delete virtual machine.
Please select number:
```

認証画面がでますので、必要条件を入力後、Azureへログインします。

![認証画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/a0c5127f-e10f-64a3-f233-2ca49df746f2.png)

ログインが正常終了すると、「Get-AzVM | Format-Table」が実行されます。そして以下のVM一覧情報を取得することができます。現在はVMが2台あることがわかります。

```
ResourceGroupName             Name  Location          VmSize  OsType  NIC
-----------------             ----  --------          ------  ------  ---
rg-hoge              hoge-vm japaneast    Standard_B2s Windows …341
rg-sample  sample-vm japaneast Standard_DS1_v2   Linux …c-1
```

### 3-2 VM作成
VM作成の流れになります。作業要求コメントにて2を入力し、Azureへログインします。その後、新規または既存のリソースグループ内にVMを作成するよ促されます。今回はリソースグループを新規で作成します。1を入力します。リソースグループ名は「rg-imura2」とします。

```
Please select resource group.      
 1. Create new resource group.     
 2. Select existing resource group.
Please select number: 1
Please new resource group name: rg-imura2
```

既存のリソースグループを選択した場合、現在作成されているリソースグループの一覧がでます。その中からリソースグループを選びます。新規、既存どちらにせよ変数「ResourceGroupName」に値が渡されます。

次にVMのOS、名前およびVMを作成する台数(1～3)を入力します。OSはWindows、名前は「vm-imura」、台数は2台とします。

```
Please select OS. 
 1. Windows
 2. Linux
Please select number: 1
Please Virtual machine name: vm-imura
How many virtual machines do you want to create?( 1 or 2 or 3)
Please select number: 2
```

次にVMのログインユーザー名、ログインパスワードを入力します。

```
PowerShell credential request
Enter your credentials.
User: azureuser
Password for user azureuser: **************
```

途中経過。進捗バーでます。
```
Creating Azure resources [100% -                                                                          ]
Creating Azure resources [18% /                                                                           ]

```

2台作成できました。スクリプトとしてはFor文と変数iを回すどの言語にもよくある処理です。

![CreateVm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/aff6fd89-c77f-3975-8831-2dc7316ab248.png)

### 3-3 VM削除
それでは作成したvmを削除します。「vm-imura1」に関連するAzureサービス群を削除します。
作業要求コメントにて3を入力し、Azureへログインします。削除対象となる「vm-imura1」を入力します。

```
ResourceGroupName             Name  Location          VmSize  OsType              NIC ProvisioningState Zone
-----------------             ----  --------          ------  ------              --- ----------------- ----
rg-hoge              hoge-vm japaneast    Standard_B2s Windows red-fwtest-vm341         Succeeded
rg-sample  sample-vm japaneast Standard_DS1_v2   Linux            nic-1         Succeeded
RG-IMURA2                vm-imura1 japaneast    Standard_B1s Windows        vm-imura1         Succeeded
RG-IMURA2                vm-imura2 japaneast    Standard_B1s Windows        vm-imura2         Succeeded

Please select the virtual machine you want to delete.
virtual machine name: vm-imura1
```

削除されました。削除処理は97-109行目で各リソースを削除しています。

![DeleteVm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/7623d232-8c24-54f8-c321-414a600d3a12.png)

スクリプト説明は以上になります。


# 4. 終わりに
本記事を最後まで読んで頂きましてありがとうございます。
私自身、Azureリソースを作成する際にPowerShellを利用することはあるのですが、スクリプトは初めてでした。考慮したい部分は多々ありますが、深みにはまりそうなのでとりあえず最低限を動くもの作成した感じです。
他にも色々なmslearn教材がありますので精度を高めていきたいです。


# 5. 参考記事
- [PowerShell を使用して管理タスクを自動化する](https://learn.microsoft.com/ja-jp/training/paths/powershell/)